模拟MVC中的HttpContext **控制器的外部**

时间:2011-08-03 08:28:43

标签: c# asp.net-mvc-3 moq viewmodel httpcontext

方案

我们正在开发一个新的MVC Web项目,我们正在尝试遵循本文所述的Skinny Controller模式http://codebetter.com/iancooper/2008/12/03/the-fat-controller/

作为我们的一项行动的一部分,我们正在从缓存中检索一些导航数据(菜单结构)。

问题

为了维护瘦的控制器模式,我们希望在ViewModel中进行缓存检查调用,我们已经尝试过,我们知道有效,使用以下代码。

var cachedCategories = (List<Category>)HttpContext.Current.Cache["Categories"];
if (cachedCategories == null) {
       cachedCategories = _service.GetCategories().ToList<Category>();
       HttpContext.Current.Cache["Categories"] = cachedCategories;
}

然而,当谈到单元测试时,我们遇到了问题。由于我们不是直接将HttpContext传递给ViewModel,我们不知道如何模拟HttpContext。

我们正在使用Moq,虽然我们有一些选项(一种是在实例化时将控制器中的上下文传递给viewmodel),但这些选项需要纯粹改变代码才能使测试工作。

有人有任何建议吗?

2 个答案:

答案 0 :(得分:1)

模拟HttpContext是一项巨大的工作,因为它是你一生中最重要的对象之一,所以最好不要嘲笑它。(http://volaresystems.com/Blog/post/Dont-模拟HttpContext.aspx) 无论如何,您可以使用MVCcontrib(http://www.codeplex.com/mvcContrib)中的文件MvcMockHelps显示它是如何完成的。

答案 1 :(得分:1)

最终,我们选择修改代码以便于测试。

我们通过在实例化时将HttpContext传递给ViewModel来实现这一点,正如我在原始问题中提到的那样。