我们有一个 ASP.NET WebForms 应用程序,我们将把它转换为 ASP.NET MVC 应用程序 - 原因之一是我们可以充分利用单元测试和 TDD。
我们当前的 WebForms 应用程序大量使用了 HttpModules。我们目前正在讨论是否应该坚持使用 HttpModules 或使用全局过滤器(这里的任何建议都会很棒)。
但是,在我的几个“hello world”测试 MVC 应用程序中,我还没有弄清楚如何在单元测试时触发 HttpModule(或者实际上是全局过滤器)代码。
也许我错了,但在我看来,我需要将它作为我的单元测试(集成测试)的一部分,否则它不能真正代表我的生产代码中正在发生的事情。
任何指导都将受到欢迎。
谢谢
格里夫
PS - 我在最初回答我的问题后添加了以下内容。
简单的组合用例
生产中
- 浏览器请求控制器方法
- HttpModule 触发(或全局过滤器) - 这会将静态 Guid 属性设置为具有值。
- 控制器方法获取此 Guid 值并在其后续逻辑中使用它
- 然后将正确的结果返回给浏览器
在单元测试中
- 单元测试调用相同的控制器方法
- HttpModule(或全局过滤器)不会触发 - 静态 Guid 属性的值为 Guid.Empty
- 控制器方法采用此 Guid 值,但由于它是空 Guid 而引发错误
- 单元测试失败
我的想法是:
- 如果控制器依赖 HttpModule(或全局过滤器)首先运行,则 HttpModule 是一个依赖项,因此必须对它的操作结果进行 Stubbed 以使测试成为真正的单元测试。
- 如果测试要包括运行 HttpModule(或全局过滤器)的效果,那么这将是一个集成测试(尽管目前尚不清楚如何让 HttpModule 或全局过滤器作为集成测试的一部分运行)
- HttpModule(或全局过滤器)应该有自己的一组单元测试
我认为这是我将采用的方法,但如果有人能建议我如何让我的集成测试(如上所述)工作,那么我将不胜感激。
我看到的问题是我的 TEST 项目在运行我的测试时变成了“启动”项目,所以 HttpModules(在 ASP.NET MVC 的 web.config 文件中定义)和全局过滤器(在 ASP.NET 中定义) MVC 的 global.asax 文件)不会运行,因为 web.config 和 global.asax 文件没有被执行。所以问题仍然存在:我如何让这些在我的集成测试中运行?
感谢大家
格里夫