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 国际奥委会注册?_Unit Testing_Inversion Of Control_Ioc Container - Fatal编程技术网

Unit testing 国际奥委会注册?

Unit testing 国际奥委会注册?,unit-testing,inversion-of-control,ioc-container,Unit Testing,Inversion Of Control,Ioc Container,您是否应该对将组件注册到IoC容器中的代码进行单元测试 如果是这样,怎么做?因为您的组件可能有自己的依赖项或执行一些初始化,所以我将用UTs介绍这个场景 差不多 iocContainer.Register(typeof(MyService1)); service = iocContainer.Get(typeof(MyService)); Debug.AssertNotNull(service); 在spring中,您可以有一个单元测试,它只加载应用程序上下文而不断言任何内容。这实际上是一个与

您是否应该对将组件注册到IoC容器中的代码进行单元测试


如果是这样,怎么做?

因为您的组件可能有自己的依赖项或执行一些初始化,所以我将用UTs介绍这个场景

差不多

iocContainer.Register(typeof(MyService1));
service = iocContainer.Get(typeof(MyService));
Debug.AssertNotNull(service);

在spring中,您可以有一个单元测试,它只加载应用程序上下文而不断言任何内容。这实际上是一个与自动构建相结合的非常有用的测试,因为spring在加载完整上下文时抱怨了很多问题。

我正在ASP.NET MVC项目中使用Windsor,我在该项目中编写了一个简单的测试,以验证所有控制器都可以实例化(即它们的依赖关系可以解决)

我对网站的每个配置(例如“开发”、“测试”、“someProductionSite”等)都有一个测试,在这里我使用该特定配置创建Windsor容器,并循环使用IController的所有非抽象实现,检查是否可以解析每个配置的一个实例

由于控制器工厂是应用程序中唯一会生成container.Resolve(…)的入口点,因此我100%确定所有配置都是有效的

一般来说,我发现编写作为整个系统断言的测试是非常有用和有价值的


例如,我还主张所有控制器动作都是虚拟的,这是一项要求,因为我使用Castle的自动事务管理将控制器动作与事务联系起来。

@aku、@krosenvold和@mookid为测试依赖项的配置是否正确提供了令人信服的论据。
但我不认为这是单元测试。
你在测试什么?您没有尝试对容器本身进行单元测试(可能不是您编写或维护的代码)。
您试图测试的是,可以创建特定类型的所有依赖项,并且可以解析该类型。这听起来像是在您的持续集成环境中进行的非常有用的系统测试或集成测试。
因此,一旦您拥有通过单元测试的二进制文件,您就可以创建容器,并在镜像您的生产环境的计算机上运行容器的设置,并测试容器应该能够解析的每个类型是否可以实际创建,以及它们的所有依赖项是否可以实例化。

在一个新的虚拟机中运行它会很好,您已经应用了最新的安装程序。

这会很有用,因为一些依赖注入框架(比如Unity)有奇怪的规则来选择调用哪个构造函数。我绝对建议进行单元测试,以确保成功注册和创建您的类型。

我觉得在我的测试项目中运行IoC容器是不对的。我还注意到,大多数由未解决的依赖项引起的bug都是由已解决的顺序依赖项引起的,这很难正确地进行测试,我不想作为单元测试来做

通常我在类的初始化例程中使用Debug.Assert语句。这为我提供了一个与IoC相关错误的预警系统,也有助于在代码中更好地指定依赖项。

我对IoC容器所做的是,首先我使用TDD为某些功能生成类,而不使用GUI(这些是单元测试)。然后,我用Guice为该特性创建了一个集成测试。此时,IoC配置(GUI模块)不完整,因此集成测试将失败。使用TDD,我逐步添加IoC配置,直到集成测试通过。我不会添加任何@Inject注释、配置行或范围声明,除非需要通过测试。因此,我将进行集成(或验收)测试,确保IoC配置正确且完整


同样的方法也适用于任何IoC容器或其他系统,其配置非常复杂,可能会出现故障-除非需要通过测试,否则不要编写任何配置。

回答此问题,具体针对:


p.S.在一些项目中,我还为构建配置编写测试,特别是在有一些复杂需求的情况下,例如使用maven shade插件。以下是我在一个项目中如何做到这一点的示例: