asp.net-mvc-3 - 单元测试因 Sessions 而失败

标签 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 消息“尚未实现”。

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

最佳答案

您的模拟设置不完整。

您需要设置 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;

关于asp.net-mvc-3 - 单元测试因 Sessions 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17542464/

相关文章:

asp.net-mvc-3 - 模型绑定(bind)逗号分隔的查询字符串参数

asp.net-mvc - 如何在 using 语句中使用 ViewBag?

c# - System.Web.Mvc.HtmlHelper<ModelName> 不包含定义

javascript - 如何对我的 Observable 的 catch 主体进行单元测试

c# - 最小起订量:设置一个模拟方法以在第一次调用时失败,在第二次调用时成功

asp.net - Moq Parent 没有默认构造函数。默认构造函数必须显式定义

asp.net-mvc - MVC3 ASPX View 对象不包含定义

android - 如何测试 Intent 是否已广播

Python:没有名为unittest的模块。我怎样才能解决这个问题?

c# - 使用 EF Core 和内存数据库进行单元测试