Модульное тестирование делегатской фабрики с Autofac - PullRequest
2 голосов
/ 22 марта 2012

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

1 Ответ

3 голосов
/ 22 марта 2012

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

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

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

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