使用Autofac对代理工厂进行单元测试

时间:2012-03-21 22:55:52

标签: c# unit-testing autofac

我正在努力证明使用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;
    }
}

^命令结构化业务层btw。

我有另一个以这种方式依赖上述命令的命令......

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 个答案:

答案 0 :(得分:3)

如果您通过容器解析SaveSpecialUserCommand,则无法模拟工厂代理,因为这是Autofac为您自动生成的部分。问题是,为什么你需要伪造实际的代表?

更新:最初存在一些误解。要“伪造”一个委托,你可以简单地使用一个lambda,如下所示:

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

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