【问题标题】:Best practices for HttpContext and testable controllers in ASP.Net MVCASP.Net MVC 中 HttpContext 和可测试控制器的最佳实践
【发布时间】:2010-11-08 12:16:23
【问题描述】:

更新:

根据我收到的几个答案,我只想说明我很清楚如何使用模拟框架来模拟 HttpContext。 与在 HttpContext 周围使用包装类相比,我更感兴趣的是了解模拟 HttpContext 的优缺点。


我正在寻找有关在 ASP.Net MVC 中构建可测试控制器时如何处理 HttpContext 的意见。在阅读了它之后,似乎有两种思想流派 - 要么构建 HttpContextBase 并使用模拟框架为您的单元测试生成所需的存根/模拟,或者围绕您打算使用的 HttpContext 区域构建不可知的包装类.

现在我倾向于构建 HttpContextBase。看起来它既是更快的开发过程,又更容易维护,因为您不必花时间开发和维护额外的包装类。我可以看到包装类可能是如何有益的,因为它们抽象出底层实现并将控制器的上下文与请求分开 - 但我不确定这是否值得额外的设置和维护开销。

您认为这两种方法的优缺点是什么?您何时会选择其中一种?是否有某些类型的开发更适合其中一种解决方案?

由于这似乎是大多数进行单元测试和使用 ASP.Net MVC 的团队都必须处理的常见问题,您将如何处理这个问题?如果您已经解决了这个问题,您的解决方案是如何发挥作用的?您现在会采取哪些不同的做法?

【问题讨论】:

    标签: asp.net-mvc unit-testing tdd mocking


    【解决方案1】:

    我使用 Rhino.Mocks 进行测试。为了在控制器中设置 HttpContext,我只是模拟了它。所以我的被测系统(或 sut)是这样的:

                Controller controllerBase = sut as Controller;
    

    然后我模拟出控制器上下文,并在控制器上下文上设置上下文以返回 HttpContextBase 类的模拟(如上所述)。我的代码看起来像:

    controllerContext = AMockOf<ControllerContext>();
    
    // Add the test HttpContextBase to the controller context
    HttpContextBase httpContextBase = SetUpTestHttpContext();
    WhenThe(controllerContext).IsAskedForIts(x =>x.HttpContext).Return(httpContextBase).Repeat.Any();
    

    对于其他物品,我有时也会使用假货。

    【讨论】:

    • 您对此设置的体验如何?您是否发现它具有可维护性、可操作性等特点?
    • 是的,它对我来说效果很好。诀窍是将其全部隐藏在测试类继承自的基类中,因此您只需执行一次,就不必再担心了。
    【解决方案2】:

    我倾向于 HttpContextBase。主要是因为我认为它是为了这个原因而发明的:可测试性。既然已经有了可接受的解决方案,为什么还要重新发明轮子。

    如果你在围绕 HttpContext 的包装类中投入大量精力,你最终会得到与 HttpContextBase 非常相似的东西......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多