方案
我们正在开发一个新的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),但这些选项需要纯粹改变代码才能使测试工作。
有人有任何建议吗?
答案 0 :(得分:1)
模拟HttpContext是一项巨大的工作,因为它是你一生中最重要的对象之一,所以最好不要嘲笑它。(http://volaresystems.com/Blog/post/Dont-模拟HttpContext.aspx) 无论如何,您可以使用MVCcontrib(http://www.codeplex.com/mvcContrib)中的文件MvcMockHelps显示它是如何完成的。
答案 1 :(得分:1)
最终,我们选择修改代码以便于测试。
我们通过在实例化时将HttpContext传递给ViewModel来实现这一点,正如我在原始问题中提到的那样。