Используйте mock.Provide() для установки фабрики делегатов, используемой в конструкторе SUT.

Я пытаюсь проверить поведение класса, когда ему передается один объект-заглушка через фабрику делегатов. Я сделал версию теста, в которой все зависимости класса (кроме фабрики) передаются как объекты Mock, и он работает как положено. Сейчас я пытаюсь использовать AutoMock, чтобы контейнер автоматически создавал макеты.

У меня проблемы с передачей конкретных значений для фабрики делегатов в конструкторе в ClassUnderTest с использованием mock.Provide(). (как этот комментарий предлагает)

Класс, который я тестирую:

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
   }
 }

}

Буду благодарен за любые указания на то, что я делаю не так. Что мне не хватает? Как это можно исправить? Это простое исправление синтаксиса или что-то не так с моим подходом к этому тесту?

Спасибо заранее за ваше время.

1 ответ

В вашем примере, когда вы звоните autoMock.Provide() вы не передаете свою фабричную функцию, но вы вызываете фабричную функцию и передаете результат (IResultField). Чтобы это исправить, позвоните

autoMock.Provide(funcToTriggerIResultFieldFactory);

Вот полный пример регистрации функции с контейнером автоматической проверки.

Другие вопросы по тегам