我正在努力证明使用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);
}
答案 0 :(得分:3)
如果您通过容器解析SaveSpecialUserCommand
,则无法模拟工厂代理,因为这是Autofac为您自动生成的部分。问题是,为什么你需要伪造实际的代表?
更新:最初存在一些误解。要“伪造”一个委托,你可以简单地使用一个lambda,如下所示:
var user = new UserImpl();
var cmd = new SaveUserCommand(...);
var command = new SaveSpecialUserCommand(user, u => cmd);