2011-01-12 26 views
0

Ich habe die folgende Klassendefinition, wobei das Feld attribute durch Reflexion durch NHibernate hydratisiert wird. Das Feld wird nicht als Objekt angezeigt, stattdessen möchte ich seine Implementierung ausblenden und nur Eigenschaften bereitstellen, die auf die Eigenschaften des Felds verweisen.Mocking private Felder mit RhinoMocks

public class CustomerAttribute : ICustomerAttribute 
{ 
    private IAttribute attribute; 

    public string DisplayName 
    { 
     get { return attribute.DisplayName;} 

    } 

}

Ich versuche, diese Aufgabe mit RhinoMocks zu verspotten, aber ich bin nicht sicher, wie das attribute Feld zum Testen Hydrat. Ich habe versucht, das attribute Feld manuell über Reflexion zu setzen, aber ich bekomme einen Proxy-Fehler von RhinoMocks (was Sinn macht).

Wie kann ich das Feld attribute hydratisieren, um die Eigenschaften des CustomerAttribute-Objekts zu testen?

Hier ist mein Test jetzt ...

 [Test] 
    public void PropertiesTest() 
    { 
     MockRepository mock = new MockRepository(); 
     ICustomerAttribute attribute = mock.StrictMock<ICustomerAttribute>(); 

     //Set the attribute field 
     FieldInfo fieldInfo = typeof(CustomerAttribute).GetField("attribute", 
                 BindingFlags.Instance | BindingFlags.SetField | 
                 BindingFlags.NonPublic); 

     fieldInfo.SetValue(attribute, new Domain.Attribute()); //This does not work 

     Expect.Call(attribute.DisplayName).Return("Postal Code"); 
     mock.ReplayAll(); 

     Assert.AreEqual(true, attribute.DisplayName); 
     mock.VerifyAll(); 

    } 

Antwort

0

Wenn CustomerAttribute Ihr Motiv zu prüfende (SUT) und IAttribute eine Abhängigkeit, die für das Testen nachgeahmt werden muss, IAttribute mehr als muss wahrscheinlich sein injizierbar in CustomerAttribute. Dies sollte entweder über einen Konstruktor (normalerweise bevorzugt) oder eine Eigenschaftspritze erfolgen. Schauen Sie sich "Inversion of Control" an, wenn Sie sich damit noch nicht auskennen.

Außerdem sollte ICustomerAttribute nicht als Schein erstellt werden - der konkrete Typ sollte explizit erstellt werden (d. H. "New CustomerAttribute"). Schließlich ist CustomerAttribute (die Implementation!) Das, was Sie zu testen versuchen.

0

Ich bin mir nicht sicher, was Sie hier testen möchten. Wenn Sie Ihre CustomerAttribute-Klasse testen möchten, müssen Sie eine Instanz davon erstellen (anstatt ICustomerAttribute zu verspotten).

Um das Attribut auf Ihrem CustomerAttribute setzen Sie könnten entweder

  • Verwenden dependency injection das richtige Attribut zu injizieren und es während der Prüfung
  • Verwenden Reflexion der realen CustomerAttribute Instanz verwenden erstellt Sie zum Testen