覆盖IOC注册以用于集成测试

时间:2011-08-04 10:12:13

标签: dependency-injection ioc-container autofac

所以我想我可能还没有完全理解你如何使用IOC容器进行集成测试。

我们假设我有几个课程:

public class EmailComposer : IComposer
{
    public EmailComposer(IEmailFormatter formatter)
    {
        ...
    }
    ...
    public string Write(string message)
    {
        ...
        return _formatter.Format(message);
    }
}

好的,以便在实际应用程序中使用(我在这里使用autofac)我会创建一个模块并执行以下操作:

    protected override void Load(ContainerBuilder containerBuilder)
    {
        containerBuilder.RegisterType<HtmlEmailFormatter>().As<IEmailFormatter>();
    }

具有完美的感觉并且效果很好。

当涉及到单元测试时,我根本不会使用IOC容器,只会在我进行测试时模拟格式化程序。再次效果很好。

现在谈谈我的集成测试...... 理想情况下,我会在集成测试期间运行完整的堆栈,但是让我们假装HtmlEmailFormatter是一些缓慢的外部WebService,因此我认为使用Test Double符合我的最佳利益。 但是......我不想在我的所有集成测试中使用Test Double,只是一个子集(一组快速运行的冒烟测试样式测试)。

此时我想注入一个web服务的模拟版本,以便我可以验证仍在其上调用正确的方法。

所以,真正的问题是:

如果我有一个带有接受多个参数的构造函数的类,我如何让其中一个参数解析为一个对象的实例(即正确设置的Mock),但其余参数由autofac填充吗

1 个答案:

答案 0 :(得分:1)

我会说你使用SetUp和TearDown(NUnit)或ClassInitialize和ClassCleanup(MSTest)。在初始化时,您注册临时测试类,并在清理时恢复到正常状态。

让DI容器为您指定所有依赖项,这样可以解决依赖关系的整个对象图。但是,如果您想要使用不同的实现进行单个测试,我会使用Mocking框架。