Я пытаюсь проверить поведение класса, когда он передал один объект-заглушку через фабрику делегатов. Я сделал версию теста, в которой все зависимости класса (за исключением фабрики) передаются как объекты Mock и работают как предполагается. Теперь я пытаюсь использовать AutoMock, чтобы контейнер автоматически создавал mocks.Используйте mock.Provide() для установки фабрики делегатов, используемой в конструкторе SUT
У меня возникли проблемы с передачей конкретных значений для фабрики делегатов в конструкторе ClassUnderTest с использованием mock.Provide(). (Как this comment предлагает)
Класс, который я тестирую:
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();
}
}
Бизнес-логика модуля:
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>();
}
испытаний Класс:
[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 чюо uld быть благодарным за любое указание на то, что я делаю неправильно. Что мне не хватает? Как это можно исправить? Является ли это простым синтаксическим исправлением или что-то не так с моим подходом к этому тесту?
Заранее благодарим за ваше время.
Обычно вы используете макетные библиотеки, чтобы издеваться над зависимостями, а не пытаться добавлять макеты в контейнер DI, потому что слишком много движущихся частей. Ваши тесты должны быть очень специфичными для этого класса, поэтому вам нужно будет иметь только несколько (если есть) макетов, настроенных –
Не должно быть autoMock.Create вместо IClassUnderTest? В чем проблема? Вы получаете компиляцию или ошибку выполнения? –
suwik
Итак, я изменил его на «autoMock.Create». Я получаю исключение System.NullReferenceException, когда я вызываю sut.MethodToTest(). resultFieldFactory (someString, secondFieldValue, thirdFieldValue) –