单元测试ASP.NET MVC 3应用程序

时间:2012-04-04 16:27:29

标签: asp.net-mvc unit-testing integration-testing rhino-mocks httpmodule

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

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

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

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

欢迎任何指导。

由于

格里夫

PS - 我在对我的问题做出初步回答后添加了以下内容。

简单化妆用例

生产中

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

    1. 单元测试调用相同的控制器方法
    2. HttpModule(或全局过滤器)不会触发 - 静态Guid属性的值为Guid.Empty
    3. 控制器方法获取此Guid值,但因为它是一个空Guid
    4. 而抛出错误
    5. 单元测试失败
    6. 我的想法是

      • 如果Controller依赖于HttpModule(或全局过滤器)首先运行,那么HttpModule是一个依赖项,因此它的操作结果必须被存根才能使测试成为真正的单元测试。
      • 如果测试要包含运行HttpModule(或全局过滤器)的效果,那么这将是 Integration 测试(尽管目前还不清楚如何获取HttpModule或Global过滤以作为集成测试的一部分运行)
      • HttpModule(或全局过滤器)应该有自己的单元测试集

      我认为这是我将采取的方法,但如果有人能够建议我如何使我的集成​​测试(如上所述)工作那么我将非常感激。

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

      谢谢大家

      格里夫

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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