我正在测试我的控制器。
在我的一个控制器方法中,我正在设置会话变量:
public void Index(){
Session["foo"] = "bar";
return View();
}
我如何对此进行单元测试?问题是测试时Session属性为null。无法进行注入,因为Session属性是只读的。
[TestMethod]
public void TestIndex()
// When
_controller.Index();
// Then
Assert.AreEqual("bar", _controller.Session["foo"])
答案 0 :(得分:7)
我个人喜欢使用模拟所有HTTP管道的MvcContrib TestHelper:
[TestMethod]
public void HomeController_Index_Action_Should_Store_Bar_In_Session()
{
// arrange
var sut = new HomeController();
new TestControllerBuilder().InitializeController(sut);
// act
sut.Index();
// assert
Assert.AreEqual("bar", (string)sut.Session["foo"]);
}
答案 1 :(得分:3)
这是我用于单元测试友好会话缓存的内容。通过检查HttpContext.Current为null,您可以通过传递nunit测试的缓存并仍然允许程序正常运行。
这是最简单的解决方案,无需在项目中进行大量代码更改。
internal class SessionCache
{
public static void Store(string key, object val) {
if (HttpContext.Current != null) {
HttpContext.Current.Session[key] = val;
}
}
public static object Retrieve(string key) {
if (HttpContext.Current != null) {
return HttpContext.Current.Session[key];
}
return null;
}
}
答案 2 :(得分:2)
我总是建议将会话对象包装在另一个对象中。这不仅为您提供了一种更简单的测试方式,而且还可以安全地访问会话类型。很容易在一个地方错误输入一个地点的会话密钥名称,然后在几个小时内查找该错误。
对象的字段为
public Foo{
get{return Session["Foo"];}
set{Session["Foo"]=value;}
}
在测试之后,您可以使用仅保留测试状态的虚拟对模拟会话类。
我通常使用依赖注入的方式。如何设置这是一个长期的考试。这是一种方式的链接 http://weblogs.asp.net/shijuvarghese/archive/2011/01/21/dependency-injection-in-asp-net-mvc-3-using-dependencyresolver-and-controlleractivator.aspx