【问题标题】:Unit test fails because of Sessions单元测试因 Sessions 而失败
【发布时间】:2013-07-06 17:16:14
【问题描述】:

我使用 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:

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

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

【问题讨论】:

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


    【解决方案1】:

    您的模拟设置不完整。

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

    【讨论】:

    • 感谢您的快速建议。你让我摆脱了痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2014-04-09
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多