0

我们有一个 ASP.NET WebForms 应用程序,我们将把它转换为 ASP.NET MVC 应用程序 - 原因之一是我们可以充分利用单元测试和 TDD。

我们当前的 WebForms 应用程序大量使用了 HttpModules。我们目前正在讨论是否应该坚持使用 HttpModules 或使用全局过滤器(这里的任何建议都会很棒)。

但是,在我的几个“hello world”测试 MVC 应用程序中,我还没有弄清楚如何在单元测试时触发 HttpModule(或者实际上是全局过滤器)代码。

也许我错了,但在我看来,我需要将它作为我的单元测试(集成测试)的一部分,否则它不能真正代表我的生产代码中正在发生的事情。

任何指导都将受到欢迎。

谢谢

格里夫

PS - 我在最初回答我的问题后添加了以下内容。

简单的组合用例

生产中

  1. 浏览器请求控制器方法
  2. HttpModule 触发(或全局过滤器) - 这会将静态 Guid 属性设置为具有值。
  3. 控制器方法获取此 Guid 值并在其后续逻辑中使用它
  4. 然后将正确的结果返回给浏览器

在单元测试中

  1. 单元测试调用相同的控制器方法
  2. HttpModule(或全局过滤器)不会触发 - 静态 Guid 属性的值为 Guid.Empty
  3. 控制器方法采用此 Guid 值,但由于它是空 Guid 而引发错误
  4. 单元测试失败

我的想法是

  • 如果控制器依赖 HttpModule(或全局过滤器)首先运行,则 HttpModule 是一个依赖项,因此必须对它的操作结果进行 Stubbed 以使测试成为真正的单元测试。
  • 如果测试要包括运行 HttpModule(或全局过滤器)的效果,那么这将是一个集成测试(尽管目前尚不清楚如何让 HttpModule 或全局过滤器作为集成测试的一部分运行)
  • HttpModule(或全局过滤器)应该有自己的一组单元测试

我认为这是我将采用的方法,但如果有人能建议我如何让我的集成测试(如上所述)工作,那么我将不胜感激。

我看到的问题是我的 TEST 项目在运行我的测试时变成了“启动”项目,所以 HttpModules(在 ASP.NET MVC 的 web.config 文件中定义)和全局过滤器(在 ASP.NET 中定义) MVC 的 global.asax 文件)不会运行,因为 web.config 和 global.asax 文件没有被执行。所以问题仍然存在:我如何让这些在我的集成测试中运行?

感谢大家

格里夫

4

3 回答 3

4

您不应该通过测试来检查全局过滤器是否触发。触发代码的机制不是您的代码,它是框架的一部分,因此框架团队应该对其进行测试。

相反,您应该简单地进行测试以确保已应用全局过滤器。

于 2012-04-04T16:38:51.533 回答
2

是否调用 HttpModule 或 Global Filter 由 Framework 处理。你不应该担心由框架处理的单元测试事情。您的单元测试应该只测试您的 HttpModule 或全局过滤器在调用时是否正常运行。

于 2012-04-04T16:31:14.553 回答
1

我会模拟 http 模块和存储库来对控制器和服务进行单元测试,在我看来,这就是单元测试的方式。全局过滤器和 httpmodules,您可以使用端到端测试对其进行测试。希望能帮助到你。

于 2012-04-05T10:44:13.237 回答