单元测试我的MVC4控制器动作方法,其中会话检查为空

本文关键字:会话 检查 方法 MVC4 我的 控制器 单元测试 | 更新日期: 2023-09-27 18:18:41

我已经开始学习单元测试在MVC4和有一个项目,我试图使用测试用例的NUnit框架进行测试。这里是我的控制器动作方法:

public ActionResult Edit(long id)
{
    if (Session["Admin"] != null)
    {
       tbl_Users objUser = new tbl_Users();
       objUser = objDBContext.tbl_Users.Find(id);
       if (objUser != null)
       {
            TempData["Edit"] = objUser;
            return PartialView("_Edit", objUser);
       }
    }
    return RedirectToAction("Logout", "Home");
}

和这里是我的测试类文件,我写TestMethod测试

[TestFixture]
public class AdminControllerTest
{
    [Test]
    public void Edit()
    {
        AdminController Admin = new AdminController();
        var id = Admin.Edit(3) as ViewResult;
        Assert.AreEqual("Edit", id.ViewName);
    }
}

问题是,当我在调试模式下运行时,它调用动作方法,但它抛出NullReference异常,因为会话["Admin"]是空的。谁能告诉我如何运行以上测试方法。由于

单元测试我的MVC4控制器动作方法,其中会话检查为空

你可以像这样模拟控制器的SessionState和HttpContext:
(此代码使用Moq)

using System.Web;
using Moq;
[TestFixture]
public class AdminControllerTest
{
    [Test]
    public void Edit()
    {
        var mockSession = new Mock<HttpSessionStateBase>();
        mockSession.Setup(f => f["admin"]).Returns(()=> "yesToAdmin");
        var mockContext = new Mock<HttpContextBase>();
        mockContext.Setup(f => f.Session).Returns(mockSession.Object);
        AdminController admin = new AdminController();
        admin.ControllerContext = new ControllerContext()
        {
            Controller = admin,
            RequestContext = new RequestContext(mockContext.Object, new RouteData())
        };
        var id = admin.Edit(3) as ViewResult;
        Assert.AreEqual("Edit", id.ViewName);
    }
}