2016-08-22 3 views
0

Ich versuche, das Verhalten einer Klasse zu testen, wenn es ein Stub-Objekt über einen Delegaten Fabrik übergeben wird. Ich habe eine Version des Tests erstellt, in der alle Abhängigkeiten der Klasse (mit Ausnahme der Factory) als Mock-Objekte übergeben werden und wie es funktioniert. Jetzt versuche ich AutoMock zu verwenden, damit der Container die Mocks automatisch erstellt.Verwenden mock.Provide(), um Setup-Delegierter Fabrik, in dem SUT-Konstruktor verwendet

Ich habe Probleme bei der Weitergabe von konkreten Werten für die Delegate Factory im Konstruktor in ClassUnderTest mit mock.Provide(). (Wie this comment schon sagt)

Klasse, die ich testen bin:

public ClassUnderTest 
{ 
private readonly firstField; 
private readonly Func<string, ISecondField, IThirdField, IResultField> resultFieldFactory; 
private int someCounter = -1; 

public ClassUnderTest(IFirstField firstField, Func<string, ISecondField, IThirdField, IResultField> resultFieldFactory) 
{ 
    this.firstField = firstField; 
    this.resultFieldFactory= resultFieldFactory; 
} 

public methodToTest() 
{ 
    IResultField resultField = resultFieldFactory(someString, secondFieldValue, thirdFieldValue); 
    resultField.AddToList(); 
} 
} 

Geschäftslogik-Modul:

public class BusinessLogicModule: Module 
{ 
//some other things that work 

builder.RegisterType<ClassUnderTest>().As<IClassUnderTest>(); 
builder.RegisterType<SecondField>().As<ISecondField>(); 
builder.RegisterType<ThirdField>().As<IThirdField>(); 
builder.RegisterType<ResultField>().As<IResultField>(); 

} 

Prüfklasse:

[TestClass] 
public class TestClass() 
{ 
private IFirstField firstField; 
private Func<string, ISecondField, IThirdField, IResultField> funcToTriggerIResultFieldFactory; 


[TestInitialize] 
public void Setup() 
{ 
    this.firstField= Resolve<IFirstField>(); 
    this.secondField= Resolve<ISecondField>(); 
    this.funcToTriggerIResultFieldFactory = Resolve<Func<string, ISecondField, IThirdField, IResultField>>(); 
} 


[TestMethod] 
public void testMethodWithAutoMock() 
{ 
    using (var automock = AutoMock.GetLoose()) 
    { 
    //trying to setup the SUT to get passed a "concrete" object 
    autoMock.Provide(funcToTriggerIResultFieldFactory(stringValue, secondFieldValue, thirdFieldValue)); 

    var sut = autoMock.Create<IClassUnderTest>; 

    sut.MethodToTest(); 
    //asserts 
    } 
} 

}

I WO Ich wäre dankbar für jeden Hinweis darauf, was ich falsch mache. Was vermisse ich? Wie könnte es repariert werden? Ist es eine einfache Syntaxkorrektur oder stimmt etwas nicht mit meiner Herangehensweise an diesen Test?

Vielen Dank im Voraus für Ihre Zeit.

+0

Normalerweise verwenden Sie Mock-Bibliotheken, die Abhängigkeiten zu verspotten, nicht versuchen und Mocks zu einem DI-Container hinzugefügt werden, da es zu viele bewegliche Teile. Ihre Tests sollten auf diese Klasse sehr spezifisch sein, so würden Sie nur wenige haben müssen (falls vorhanden) spottet einrichten –

+0

Sollte es nicht sein autoMock.Create statt IClassUnderTest? Was ist das eigentliche Problem? Erhalten Sie eine Kompilierung oder einen Ausführungszeitfehler? – suwik

+0

Also habe ich es in "autoMock.Create " geändert. Ich erhalte eine System.NullReferenceException, wenn ich sut.MethodToTest() aufrufen. resultFieldFactory (einigeString, secondFieldValue, thirdFieldValue) –

Antwort

0

In Ihrem Beispiel, wenn Sie autoMock.Provide() aufrufen, übergeben Sie nicht Ihre Werksfunktion, sondern Sie rufen die Werksfunktion auf und übergeben das Ergebnis (IResultField). Um dies zu beheben, rufen Sie

autoMock.Provide(funcToTriggerIResultFieldFactory); 

Here ist ein vollständiges Beispiel eine Funktion mit dem Auto spöttischen Container Registrierung.

Verwandte Themen