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

发布于 2024-11-28 17:35:42 字数 396 浏览 2 评论 0 原文

我正在对我的控制器进行单元测试。

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

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

I am unit testing my controller.

In one of my controller methods I am setting Session variables:

 public void Index(){
      Session["foo"] = "bar";

      return View();
 }

How can I unit test this? The problem is that the Session property is null when testing. Injecting is not possible because the Session property is readonly.

 [TestMethod]
 public void TestIndex()
     // When
     _controller.Index();

     // Then
     Assert.AreEqual("bar", _controller.Session["foo"])

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

稚气少女 2024-12-05 17:35:42

就我个人而言,我喜欢使用 MvcContrib TestHelper 来模拟所有 HTTP 管道:

[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"]);
}

Personally I like using the MvcContrib TestHelper which mocks all the HTTP pipeline:

[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"]);
}
橙幽之幻 2024-12-05 17:35:42

这就是我用于单元测试友好的会话缓存的方法。通过检查 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;
    }
}

This is what I used for Unit Test friendly Session Caching. By checking HttpContext.Current for null, you're by passing the caching for nunit tests and still allow your program to function normally.

This is the simplest solution without making a lot of code changes in your project.

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;
    }
}
柠檬色的秋千 2024-12-05 17:35:42

我总是建议将会话对象包装在另一个对象中。这不仅为您提供了更简单的测试方法,而且还使所有对会话类型的访问都变得安全。很容易在一个地方的一个地方输入错误的会话密钥名称,然后花费数小时寻找错误。

该对象将具有以下字段:

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

I always recommend wrapping the session object in another object. This not only gives you an easier way to test, but also makes all access to the session type safe. It is very easy to mistype a session key name in one spot in one place and then hunt for the bug for hours.

The object would have fields as

public Foo{
    get{return Session["Foo"];}
    set{Session["Foo"]=value;}  
}

Once you are testing you can mock the session class with a dummy that only keeps state for the test.

The way I usually handle this is with dependency injection. How to set this up is a long examination. Here is a link to one way
http://weblogs.asp.net/shijuvarghese/archive/2011/01/21/dependency-injection-in-asp-net-mvc-3-using-dependencyresolver-and-controlleractivator.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文