3

在作为 Asp.Net Mvc 应用程序执行期间,autofac 的属性注入成功工作,如下所述:

http://code.google.com/p/autofac/wiki/Mvc3Integration#Filter_Attribute_Property_Injection

如果我将相同的逻辑带到(nunit)单元测试中,则不会将属性注入到我的自定义属性中。mvc 扩展中是否有一些特定的东西会导致它在单元测试中不起作用?

谢谢

4

2 回答 2

3

过滤器属性属性注入作为 MVC/ASP.NET 管道的一部分工作,而不是作为独立功能提供的东西。

您可能会注意到MVC 控制器上的过滤器实际上也不会在单元测试期间执行。例如,将 HandleErrorAttribute 放在控制器操作上,并在单元测试中从该操作引发异常。请注意 HandleErrorAttribute 没有被调用来尝试将您发送到错误视图?

这是因为在单元测试场景中,您不在 MVC 管道中- 您正在将控制器/操作作为 POCO(普通旧 CLR 对象)进行测试。您不会获得模型绑定、过滤器、HttpModules 或您通常视为真正集成/执行的一部分的任何其他内容。

这不是错误,这是设计使然。它类似于您可以对 WCF 服务实现进行单元测试的方式,如果您通过 web.config 将行为附加到它们,您将不会在单元测试中看到这些行为。您的单元测试未在管道中执行,它仅针对作为独立实体的一个类执行。

如果您需要测试整个事情如何与过滤器和所有东西一起工作 -集成测试- 您需要考虑使用浏览器自动化或其他一些编程 Web 客户端机制从正在运行的 Web 应用程序版本中检索内容。要使管道到位,您必须实际运行在真实的完整运行时中,而不是在标准/独立单元测试环境中。

至于是否可以在单元测试中使用 DI ......这更多是个人喜好。我在一些测试中使用它,但是当我这样做时,我将模拟/存根作为依赖项连接起来,这样我就可以控制被测系统与其依赖项之间的交互。你不需要 DI 来做到这一点。您可以手动构建所有虚假依赖项,然后在没有任何 DI/IoC 容器的情况下将它们插入。也就是说,在单元测试环境中,您不应该连接 The Real Dependencies,因为那样您就不会将您的类作为一个单元进行测试——这是一个集成测试。

于 2012-06-19T15:23:30.100 回答
2

您应该避免使用 DI 进行单元测试。单元测试就是测试特定代码段的功能,而不是其他代码。在您的情况下,如果您正在测试自定义属性,那么您应该直接设置依赖项,而不依赖任何 IoC 容器来执行此操作。

大多数情况下,依赖项将被模拟对象而不是真实对象替换。

于 2012-06-19T03:00:52.000 回答