MVC3中的单元测试控制器会话变量

时间:2011-08-08 13:31:05

标签: unit-testing asp.net-mvc-3 session controller

我正在测试我的控制器。

在我的一个控制器方法中,我正在设置会话变量:

 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"])

3 个答案:

答案 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