Unit testing 存在应用级和请求级IoC容器的测试系统

Unit testing 存在应用级和请求级IoC容器的测试系统,unit-testing,dependency-injection,domain-driven-design,unity-container,Unit Testing,Dependency Injection,Domain Driven Design,Unity Container,我的团队正在开发一个系统,我们使用Unity作为我们的IoC容器;为了在每个HTTP请求上提供NHibernate ISessions(工作单元),我们使用Unity为每个请求创建一个子容器,并将ISession粘贴在其中 我们是在之后才采用这种方法的,现在正试图决定一种单元测试策略 现在,应用程序级容器本身位于HttpApplication中,而请求容器位于HttpContext.Current中。显然,在测试期间两者都不存在 当我们决定使用域层中的服务位置来“惰性地”解决容器中的依赖关系时,

我的团队正在开发一个系统,我们使用Unity作为我们的IoC容器;为了在每个HTTP请求上提供NHibernate ISessions(工作单元),我们使用Unity为每个请求创建一个子容器,并将ISession粘贴在其中

我们是在之后才采用这种方法的,现在正试图决定一种单元测试策略

现在,应用程序级容器本身位于HttpApplication中,而请求容器位于HttpContext.Current中。显然,在测试期间两者都不存在

当我们决定使用域层中的服务位置来“惰性地”解决容器中的依赖关系时,痛苦增加了。现在我们有更多的组件想要与容器对话

我们也在使用MSTest,在测试期间也会使用MSTest

所以我们想知道,So社区中的聪明人是如何解决这一困境的

如何设置一个应用程序,该应用程序在“真实”运行时依赖HTTP对象来保存容器,但在测试过程中可以灵活地一致地构建和分解容器,并让ServiceLocation位到达这些精确的容器

我希望问题清楚,谢谢


谢谢你的回复。我同意使用服务定位并不是最佳方法,但在这种情况下似乎确实有必要。该场景是,我们需要我们的实体来解决依赖关系,按需,只有在需要时——用于业务规则验证。在NHibernate具体化后,强制所有实体进行构造函数注入似乎并不合适,至少是出于性能原因

我们正在考虑一种解决方案,其中容器在实际运行时存储在HttpApplication/HttpContext中,在测试期间存储在static/ThreadStatic字段中。对这种解决方案有什么想法吗?谢谢

此外,这不一定是集成测试(尽管它也可能参与其中)。例如,我们想对一个特定实体的业务规则行为进行单元测试——在此期间,这个场景将展开

我肯定对Http对象抽象持开放态度——我在MVC中使用过并喜欢它们;如何让他们走出MVC

DI容器。相反,在应用程序启动时使用DI容器来解析应用程序的依赖关系图,然后让开

然而,听起来你已经应用了,你现在感觉到了痛苦。不幸的是,没有简单的方法可以解决这个问题

显然,在单元测试期间,您不能依赖真实的HTTP上下文,因为它在该环境中不可用,所以您需要将它们隐藏在接口后面。如果您使用的是.NET 3.5 SP1,那么您可能可以使用System.Web.abstractions中引入的抽象,但除此之外,您可以自己提取一些

一旦将这些接缝引入到系统中,就可以使用适当的依赖项注入(最好是构造函数注入)将它们注入到消费类中


在任何情况下,遵循测试驱动开发可以非常有效地防止这种紧耦合从一开始就被引入。

如果您正在测试您的单个类,那么我将称之为“单元测试”。但是,如果您试图确保所有类都与Unity容器进行适当的交互,那么我将称之为“集成测试”。这可能会帮助您找到更好的答案,也许像OK一样,在聚会之后,我们决定取消ServiceLocation的使用可能是一条出路。我们可以通过将解决规则相关依赖关系的责任放在应用程序层(WCF服务)上,并根据需要将它们传递到实体中,从而从域层删除它。非常感谢您提供的链接(很棒的博客)和answer.FWIW,请参阅以下关于在WCF中启用DI的答案: