2012-03-21 3 views
2

Я работаю над проверкой использования инъекций зависимостей с некоторыми многочисленными каркасами DI. Я пытаюсь попытаться выполнить тестирование некоторых классов, в настоящее время использующих Autofac в качестве контейнера DI.Модуль Тестирование фабрики делегатов с Autofac

Скажем, у меня есть этот класс ...

public class SaveUserCommand : DBCommandBase<UserImpl> 
{ 
    public delegate SaveUserCommand Factory(UserImpl impl); 

    private UserImpl impl; 
    private IAuditableHelper helper; 

    public SaveUserCommand(UserImpl impl, IAuditableHelper helper) 
    { 
     this.impl = impl; 
     this.helper = helper; 
    } 

    public override UserImpl Execute(object dataTrans) 
    { 
     return this.impl; 
    } 
} 

^Команда структурирован бизнес слой кстати.

У меня есть другая команда, которая опирается на вышеприведенной команды таким образом ...

public class SaveSpecialUserCommand : DBCommandBase<UserImpl> 
{ 
    public delegate SaveSpecialUserCommand Factory(UserImpl user); 

    private UserImpl user; 
    SaveUserCommand.Factory saveUserCommand; 

    public SaveSpecialUserCommand(UserImpl user, SaveUserCommand.Factory saveUserCommand) 
    { 
     this.user = user; 
     this.saveUserCommand = saveUserCommand; 
    } 

    public override UserImpl Execute(object dataTrans) 
    { 
     this.user.IsSpecial = true; 
     this.saveUserCommand(this.user).Execute(dataTrans); 
     return this.user; 
    } 
} 

Использование Autofac, он решает все зависимости в SaveSpecialUserCommand.

То, что я не уверен, - это то, как я могу выполнить единичный тест или ввести макет в делегат SaveUserCommand.Factory.

Подсказки были бы хорошими. Я все еще хочу понять это, но общее направление было бы потрясающим.

EDIT

Просто добавив простой тестовый пример, показывающий, я не хочу использовать Autofac в моих модульных тестов, чтобы создать свои команды.

[Test] 
    public void SomeSimpleTestTest() 
    { 
     var user = new UserImpl(); 

     var command = new SaveSpecialUserCommand(user, /*This is what I need to mock. SaveUserCommand.Factory*/null); 
     var retVal = command.Execute(this._mockTransaction); 

     Assert.IsNotNull(retVal); 
     Assert.IsTrue(retVal.IsSpecial); 
    } 

ответ

3

Если разрешить SaveSpecialUserCommand через контейнер, вы не можете издеваться заводскую делегата, так как это часть, которая Autofac autogenerates для вас. Вопрос в том, почему вам нужно подделать фактического делегата?

Обновление: бит непонимания первоначально там. Чтобы «подделать» делегата, вы можете просто использовать лямбда, например:

var user = new UserImpl(); 
var cmd = new SaveUserCommand(...); 

var command = new SaveSpecialUserCommand(user, u => cmd); 
+0

Ну, я не планировал, чтобы Autofac создавал мои команды для модульных тестов. Я отредактирую с помощью тестового примера, с которым я * пытался * работать. – DavidAndroidDev

+0

Хм ... Если вы не предлагаете мне использовать мой контейнер DI в своих модульных тестах и ​​размещать mocks внутри контейнера для тестовых случаев? – DavidAndroidDev

+0

Нет, у меня создалось впечатление, что вы * использовали * контейнер в своем модульном тесте. См. Мой обновленный ответ. –

Смежные вопросы