我正在考虑将我们的一些复杂的创建代码转换为使用 IoC 容器 Autofac,并且因为我非常相信 TDD,所以我正在为模块配置编写单元测试。
大多数功能都很容易测试,例如
var obj = container.Resolve<IThing>();
Assert.IsInstanceOfType(obj, typeof(ThingImplementer));
但是我们有很多情况,我们有多个相同接口(interface)的实现者,并且不同的实现者被传递给不同的具体类。我已经通过使用命名注册解决了这个问题,例如
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。我想知道是否值得付出努力,我们确实有涵盖这一点的高级集成测试,但它们没有提供单元测试所做的文档或重构好处。
你会为此写一个单元测试吗?
如果是这样,怎么做?
请您参考如下方法:
您通常不会在单元测试中测试容器的配置。在您的单元测试环境中,您不使用容器来注入(inject)任何依赖项(您手动执行此操作),如果您这样做,您将注入(inject)假对象,而不是真实/生产类型。因此,单元测试通常不知道容器配置。
有时我倾向于测试容器是否能够创建应用程序的根类型(例如 MVC 应用程序的 Controller 类或 WebForms 应用程序的 Page 类)。因为容器将实例化一个对象图,所以它会让我很好地了解容器是否配置正确。但是,如果容器返回正确的实现,我从不感兴趣。大多数时候,甚至只有一个注册接口(interface)的实现可供应用程序根访问,因此它几乎不会出错。
如果你想测试你的容器配置,也许它太复杂了,你应该尝试简化你的应用程序设计,这样你就可以简化注册。




