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.
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 –
Sollte es nicht sein autoMock.Create statt IClassUnderTest? Was ist das eigentliche Problem? Erhalten Sie eine Kompilierung oder einen Ausführungszeitfehler? –
suwik
Also habe ich es in "autoMock.Create" geändert. Ich erhalte eine System.NullReferenceException, wenn ich sut.MethodToTest() aufrufen. resultFieldFactory (einigeString, secondFieldValue, thirdFieldValue) –