更新
基于我收到的几个答案,我只想说明我很清楚如何使用模拟框架来模拟HttpContext。 我更感兴趣的是,与使用HttpContext周围的包装类相比,模拟HttpContext的优点和缺点是什么。
我正在寻找在ASP.Net MVC中构建可测试控制器时如何处理HttpContext的意见。在阅读之后,似乎有两种思想流派 - 或者构建HttpContextBase并使用模拟框架为您的单元测试生成所需的存根/模拟,或者在您打算使用的HttpContext区域周围构建不可知的包装类
现在我倾向于建立HttpContextBase。看起来它既是更快的开发过程又更容易维护,因为您不必花时间开发和维护其他包装类。我可以看到包装类如何有用,因为它们抽象出底层实现并将控制器的上下文与请求分开 - 但我不确定这是否值得设置和维护的额外开销。
您觉得这两种方法之间的利弊是什么?您何时会选择其中一种?某些类型的开发是否比其他开发更适合其中一种解决方案?
由于这似乎是一个常见问题,大多数单元测试和使用ASP.Net MVC的团队都必须处理,你或者如何处理这个问题?如果您已经解决了这个问题,那么您的解决方案是如何工作的以及您现在会采取哪些不同的做法?
答案 0 :(得分:6)
我倾向于HttpContextBase。主要是因为我认为它是出于这个原因而发明的:可测试性。当有一个可接受的解决方案时,为什么重新发明轮子。
如果你在HttpContext的包装类中付出了很多努力,你最终会得到与HttpContextBase类似的东西......
答案 1 :(得分: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();
对于其他物品,我有时也会使用假货。