Модульное тестирование фабрики делегатов с помощью Autofac

Я работаю над доказательством использования внедрения зависимостей с некоторыми многочисленными 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);
    }

person DavidAndroidDev    schedule 21.03.2012    source источник


Ответы (1)


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

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

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

var command = new SaveSpecialUserCommand(user, u => cmd);
person Peter Lillevold    schedule 22.03.2012
comment
Ну, я не планировал, что Autofac создаст мои команды для модульных тестов. Я отредактирую тестовый пример, с которым я пытался работать. - person DavidAndroidDev; 22.03.2012
comment
Хм... Если только вы не предлагаете мне использовать контейнер DI в модульных тестах и ​​размещать мокапы внутри контейнера для тестовых случаев? - person DavidAndroidDev; 22.03.2012
comment
Нет, у меня сложилось впечатление, что вы действительно использовали контейнер в своем модульном тесте. Тогда смотрите мой обновленный ответ. - person Peter Lillevold; 22.03.2012