由于Sessions,单元测试失败

Sim*_*mon 3 unit-testing moq asp.net-mvc-3

我用MVC3,并希望通过测试以下行动Microsoft.VisualStudio.TestTools.UnitTesting,并Moq:

public ActionResult index()
{
        Session.Add("username", "Simon");
        var lName = Session["username"] as String;
        var lSessionID = Session.SessionID;
        return Content(lSessionID);
}
Run Code Online (Sandbox Code Playgroud)

我的单元测试:

[TestMethod]
public void IndexTest()
{

    // Arrange

    var contextMock = new Mock<ControllerContext>();
    var mockHttpContext = new Mock<HttpContextBase>();

    var session = new Mock<HttpSessionStateBase>();
    mockHttpContext.Setup(ctx => ctx.Session).Returns(session.Object);

    StartController controller = new StartController();

    var lResult = controller.index() as ContentResult;

    Assert......;
}
Run Code Online (Sandbox Code Playgroud)

我的单元测试导致NullReferenceException:

在此输入图像描述

我也尝试MvcContrib.TestHelper了失败的Session.SessionID消息"尚未实现".

如何使用单元测试来测试我的Action?

nem*_*esv 9

您的模拟设置不完整.

你需要设置ControllerContextc.HttpContext以返回你的mockHttpContext,你还需要使用你contextMockStartController设置其ControllerContext 属性:

所以以下设置应该有效:

var contextMock = new Mock<ControllerContext>();
var mockHttpContext = new Mock<HttpContextBase>();
var session = new Mock<HttpSessionStateBase>();

mockHttpContext.Setup(ctx => ctx.Session).Returns(session.Object);   
contextMock.Setup(ctx => ctx.HttpContext).Returns(mockHttpContext.Object);

StartController controller = new StartController();
controller.ControllerContext = contextMock.Object;
Run Code Online (Sandbox Code Playgroud)