由于Sessions,单元测试失败

时间:2013-07-09 07:29:47

标签: asp.net-mvc-3 unit-testing moq

我使用MVC3并希望通过Microsoft.VisualStudio.TestTools.UnitTestingMoq测试以下操作:

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

我的单元测试:

[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......;
}

我的单元测试导致NullReferenceException:

enter image description here

我还尝试MvcContrib.TestHelper失败了Session.SessionID,但消息“尚未实现”。

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

1 个答案:

答案 0 :(得分:9)

您的模拟设置不完整。

您需要设置ControllerContextc.HttpContext以返回mockHttpContext,并且还需要使用contextMock中的StartController设置其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;