【发布时间】:2011-08-03 08:28:42
【问题描述】:
场景
我们正在开发一个新的 MVC Web 项目,并尝试遵循本文http://codebetter.com/iancooper/2008/12/03/the-fat-controller/ 中描述的 Skinny 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,虽然我们有一些选项(一种是在实例化时将上下文从控制器传递到视图模型),但这些选项需要更改代码才能使测试正常工作。
有人有什么建议吗?
【问题讨论】:
-
可以在控制器上放置一个可分配给局部变量的属性,如果它为空,则分配 HttpContect.Current,并返回 HttpContextBase,您可以从测试中分配 HttpContextBase。如果这有意义的话。
-
事实上,如果您使用的是 IoC 框架,您可以自动将 HttpContext.Current 分配给 HttpContextBase 属性(或构造函数),那么您可以只拥有一个字段或自动属性。 (嗯,我认为这是关于此的博文;))
-
仅出于测试目的添加属性是我们提出的选项之一,但我们宁愿不这样做。我们试图避免纯粹为了测试而添加代码。
-
您添加的属性不是纯粹用于测试,而是抽象出一个依赖项。这只是如何知道要采取的海滩方法,因为我不知道您是否使用了 IoC 框架。
标签: c# asp.net-mvc-3 moq viewmodel httpcontext