单元测试 – 如何使用命名组件对此IoC注册进行单元测试? (Autofac)

我正在考虑将一些复杂的创建代码转换为使用IoC容器,Autofac,因为我非常相信TDD,我正在为Module配置编写单元测试.

大多数功能都很容易测试,例如

var obj = container.Resolve<IThing>();
Assert.IsInstanceOfType(obj, typeof(ThingImplementer));

但是我们有很多情况,我们有多个相同接口的实现者,不同的实现者被传递给不同的具体类.我通过使用命名注册解决了这个问题,例如:

builder.RegisterType<ThingImplementer>().Named<IThing>("Implementer1");
builder.RegisterType<OtherImplementer>().Named<IThing>("Implementer2");
builder.Register(c => new Foo(c.ResolveNamed<IThing>("Implementer1"))).As<IFoo>();

我无法弄清楚的是编写单元测试以确保Foo获得ThingImplementer而不是OtherImplementer的简单方法.我想知道是否值得付出努力,我们确实有高级集成测试来涵盖这一点,但他们没有提供单元测试所做的文档或重构好处.

你会为此写一个单元测试吗?
如果是这样,怎么样?

最佳答案
您通常不会在单元测试中测试容器的配置.在您的单元测试环境中,您不使用容器来注入任何依赖项(您手动执行此操作),如果您这样做,您将注入假对象,而不是真实/生产类型.因此,容器配置通常不为您的单元测试所知.

我倾向于做的有时候是测试容器是否能够创建应用程序的根类型(例如MVC应用程序的控制器类,或WebForms应用程序的Page类).因为容器将实例化对象图,所以我会很好地了解容器是否配置正确.但是,如果容器返回正确的实现,我永远不会感兴趣.在大多数情况下,甚至有只注册界面是应用程序根目录访问的一种实现方式,所以它几乎没有可能出错.

如果你想测试你的容器的配置,也许是太复杂了,你应该尽量简化您的应用程序设计,使您可以简化注册.

转载注明原文:单元测试 – 如何使用命名组件对此IoC注册进行单元测试? (Autofac) - 代码日志