在控制器的MVC**外部**中模拟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,虽然我们有一些选项(一个是在实例化时将上下文从控制器传递到视图模型(,但这些选项需要更改代码以使测试工作。

有人有什么建议吗?

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

最终,我们选择修改代码,以便进行更简单的测试。

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

相关内容

  • 没有找到相关文章

最新更新