2016-08-22 10 views
0

Я пытаюсь проверить поведение класса, когда он передал один объект-заглушку через фабрику делегатов. Я сделал версию теста, в которой все зависимости класса (за исключением фабрики) передаются как объекты 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 быть благодарным за любое указание на то, что я делаю неправильно. Что мне не хватает? Как это можно исправить? Является ли это простым синтаксическим исправлением или что-то не так с моим подходом к этому тесту?

Заранее благодарим за ваше время.

+0

Обычно вы используете макетные библиотеки, чтобы издеваться над зависимостями, а не пытаться добавлять макеты в контейнер DI, потому что слишком много движущихся частей. Ваши тесты должны быть очень специфичными для этого класса, поэтому вам нужно будет иметь только несколько (если есть) макетов, настроенных –

+0

Не должно быть autoMock.Create вместо IClassUnderTest? В чем проблема? Вы получаете компиляцию или ошибку выполнения? – suwik

+0

Итак, я изменил его на «autoMock.Create ». Я получаю исключение System.NullReferenceException, когда я вызываю sut.MethodToTest(). resultFieldFactory (someString, secondFieldValue, thirdFieldValue) –

ответ

0

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

autoMock.Provide(funcToTriggerIResultFieldFactory); 

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