Я работаю над доказательством использования внедрения зависимостей с некоторыми многочисленными DI-фреймворками. Я пытаюсь провести модульное тестирование некоторых классов, которые в настоящее время используют Autofac в качестве контейнера DI.
Допустим, у меня есть этот класс...
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
.
Подсказки были бы хороши. Я все еще хочу понять это, но общее направление было бы потрясающим.
ИЗМЕНИТЬ
Просто добавлю простой тестовый пример, показывающий, что я не хочу использовать 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);
}