ASP.NET MVC:在控制器中访问HttpContext是否合适?

时间:2012-04-07 10:35:18

标签: asp.net-mvc unit-testing webforms

我一直在使用ASP.NET(WebForm)一段时间,但是ASP.NET MVC的新手。从我读过的很多文章中,在大多数情况下,控制器难以测试的原因是因为它们正在访问运行时组件:HttpContext(包括Request,Response ...)。在控制器中访问HttpContext似乎很糟糕。

但是,我必须在某处访问这些组件,从Request读取输入,通过Response发回结果,并使用Session来保存一些状态变量。

那么,如果我们不在控制器中访问这些运行时组件,那么访问这些运行时组件的最佳位置在哪里?

3 个答案:

答案 0 :(得分:1)

当您在控制器中调用模型方法时,请求和响应对象携带相同的值或输出到同一个源。 “页面”对于这些对象至关重要。

还有一件事,RequestSessionResponse对象可能无法在模型中直接引用,因此您可以使用System.Web.HttpContext.Current来获取对象。它们的功能与从控制器调用的功能相同。

并且控制器意味着作为视图和模型之间的桥梁,并且模型应该可以工作,即使这些对象中没有任何响应或请求值,所以我会像往常一样使用这些对象的值参数来建模方法,而不是在模型中引用它们。这是MVC概念的正确用法。

答案 1 :(得分:0)

如果您真的必须从控制器访问这些对象,您可以随时抽象它们并注入它们的模拟实例,以将您的测试与控制器隔离开来。

答案 2 :(得分:0)

在MVC中,HttpContext实际上是HttpContextBase。直接使用这些类是完全正确的。如果您需要稍后测试您的控制器,您可以非常轻松地模拟这些类。

http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx

我认为你想做什么没有错。

  

在控制器中访问HttpContext似乎很糟糕。

不,不,它只是要求您考虑如何测试您的行动。如果你不测试,那么你可能甚至没有问题。我建议你测试一下。