ASP.返回会话的.NET MVC单元测试方法

本文关键字:MVC 单元 测试方法 NET 返回 会话 ASP | 更新日期: 2023-09-27 18:05:47

我正在使用NUnit和Moq进行单元测试。我尝试了这个例子,它检查一个名为Role的会话对象是否存在。如果没有,则创建它,并返回一个Role类型的对象。

protected Role GetRole()
    {
        if (Session["Role"] == null)
        {
            Session["Role"] = new Role();
        }
        return Session["Role"] as Role;
    }

然后在索引操作中使用它:

public ActionResult Index()
    {
        var roles = GetRole();
        roles.RoleName = "Test";
        return View();
    }

这是我的测试:

[Test]
    public void TestMethod1()
    {
        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);
        contextMock.Setup(p => p.HttpContext.Session["Role"]).Returns(new Role
                                                                      {
                                                                          RoleId = 1,
                                                                          RoleName = "Test"
                                                                      });
        var homeController = new HomeController();
        homeController.ControllerContext = contextMock.Object;
        var indexView = homeController.Index();
        Assert.IsNotNull(indexView);
    }

运行成功。但是当我检查代码覆盖率时,它给了我Session["Role"] = new Role();部分没有被测试代码覆盖。所以我做了另一个测试。这里我没有设置会话变量Role:

[Test]
    public void TestMethod2()
    {
        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);
        var homeController = new HomeController();
        homeController.ControllerContext = contextMock.Object;
        var indexView = homeController.Index();
        Assert.IsNotNull(indexView);
        Assert.IsNull(homeController.ControllerContext.HttpContext.Session["Role"]);
    }

但是它失败了——它给出了System。NullReferenceException:由于角色的关系,对象引用没有设置为对象的实例。RoleName = "Test";行。如何让它运行?提前感谢!

ASP.返回会话的.NET MVC单元测试方法

您的问题是,在第二个测试Session["Role"]将永远不会返回任何东西,因为它是一个模拟对象设置为始终返回null。一种可能的解决方法是将GetRole函数更改为此并调整测试:

protected Role GetRole()
{
    var role = Session["Role"] as Role;
    if (role == null)
    {
        role = new Role();
        Session["Role"] = role;
    }
    return role;
}