Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何使用命名组件对IoC注册进行单元测试?(自动传真)_Unit Testing_Ioc Container_Autofac - Fatal编程技术网

Unit testing 如何使用命名组件对IoC注册进行单元测试?(自动传真)

Unit testing 如何使用命名组件对IoC注册进行单元测试?(自动传真),unit-testing,ioc-container,autofac,Unit Testing,Ioc Container,Autofac,我正在考虑将一些复杂的创建代码转换为使用IoC容器Autofac,因为我非常相信TDD,所以我正在为模块配置编写单元测试 大多数功能都很容易测试,例如 var obj = container.Resolve<IThing>(); Assert.IsInstanceOfType(obj, typeof(ThingImplementer)); var obj=container.Resolve(); IsInstanceOfType(obj,typeof(ThingImplemente

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

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

var obj = container.Resolve<IThing>();
Assert.IsInstanceOfType(obj, typeof(ThingImplementer));
var obj=container.Resolve();
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>();
builder.RegisterType().Named(“Implementer1”);
builder.RegisterType().Named(“Implementer2”);
Register(c=>newfoo(c.ResolveNamed(“Implementer1”)).As();
我想不出一个简单的方法来编写单元测试,以确保Foo得到的是ThingImplementer而不是其他实现者。我想知道这样做是否值得,我们确实有高级别的集成测试来涵盖这一点,但它们没有提供单元测试所能提供的文档或重构好处

你会为此编写一个单元测试吗?
如果是,如何测试?

您通常不会在单元测试中测试容器的配置。在您的单元测试环境中,您不使用容器来注入任何依赖项(您可以手动进行),如果您要这样做,您将注入假对象,而不是真实/生产类型。因此,单元测试通常不知道容器配置

有时我倾向于测试容器是否能够创建应用程序的根类型(例如MVC应用程序的控制器类或WebForms应用程序的页面类)。因为容器将实例化一个对象图,所以我可以很好地了解容器是否配置正确。但是,如果容器返回正确的实现,我就不感兴趣。大多数情况下,甚至只有一个注册接口的实现可供应用程序根访问,因此它几乎不会出错


如果您想测试容器配置,可能它太复杂了,您应该尝试简化应用程序设计,以便简化注册。

这里没有什么新内容,只是对Steven观点的扩展

正如史蒂文所说,这绝对不是单元测试。你也许可以把它看作是一种学习测试。看看Ninject测试套件——它展示了他们是如何进行此类测试的(但请记住,他们正在编写一个容器)。我想autofac也有类似的测试

话虽如此,如果您觉得有一些有趣的行为,并且不会变得不稳定,那么将其放入集成套件并没有什么坏处

关于它是外部的这一事实的另一点也是非常有效的——参见