如何在单元测试中从我的MVC-Framework获取Session.SessionID?

时间:2013-07-08 08:28:02

标签: c# asp.net-mvc asp.net-mvc-3 unit-testing mocking

对于我的单元测试,我使用Microsoft.VisualStudio.TestTools.UnitTestingMvcContrib.TestHelper

我在控制器中的行动:

    public ActionResult index()
    {
        try
        {
            Session.Add("username", "Simon");
            var lSessionID = Session.SessionID;

            return Content(lSessionID);
        }
        catch 
        { 

        }

        return Content("false");
    }

我的单元测试:

[TestMethod]
public void IndexTestMethod1()
{

    TestControllerBuilder builder = new TestControllerBuilder();

    StartController controller = new StartController();

    builder.InitializeController(controller);

    var lResult = controller.index();

    var lReturn = ((System.Web.Mvc.ContentResult)(lResult)).Content; // returns "false"

    Assert.IsFalse(lReturn == "false");
}

当我在浏览器中调用index() - 操作时,它会显示会话ID。当我通过单元测试调用操作时,lReturn"false"而不是预期的会话ID。

如何在单元测试中获取Session.SessionID?

1 个答案:

答案 0 :(得分:2)

Session变量从ControllerContext.HttpContext.Session读取,Session的类型为HttpSessionStateBase。

在单元测试中,您可以使用设置ControllerContext对象。 (或使用像moq这样的模拟提供商)。 我尚未测试代码

var contextMock = new Mock<ControllerContext>();
var mockHttpContext = new Mock<HttpContextBase>();
var session = new Mock<HttpSessionStateBase>();
mockHttpContext.Setup(h => h.Session).Returns(session.Object);
contextMock.Setup(c => c.HttpContext).Returns(mockHttpContext.Object);