【问题标题】:Unit Testing my MVC4 Controller Action Method where Session is checked for null单元测试我的 MVC4 控制器操作方法,其中会话被检查为空
【发布时间】:2016-01-20 05:23:42
【问题描述】:

我已经开始学习 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);
    }
}

问题是,当我在调试模式下运行时,它会调用 Action Method,但由于 Session["Admin"] 为 null,它会引发 NullReference 异常。谁能告诉我如何在测试方法之上运行。谢谢

【问题讨论】:

    标签: c# unit-testing asp.net-mvc-4 session nunit


    【解决方案1】:

    您可以像这样模拟控制器的 SessionState 和 HttpContext:
    (此代码使用起订量)

    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);
        }
    }
    

    【讨论】:

    • 我从 NUGET 添加了 MOQ 参考,甚至在我的测试项目中添加了命名空间,但我收到了这个警告“找不到类型或命名空间名称 'HttpSessionStateBase'(您是否缺少 using 指令或程序集参考?) ”。用谷歌搜索没有结果
    • 尝试添加对 System.Web 的引用,我会更新答案
    • 这就是您所缺少的,对此msdn.microsoft.com/en-us/library/… 的引用。您需要检查您的项目以及代码中是否引用了它。有很多关于 SO 和谷歌的资源可以帮助你解决这个问题。
    猜你喜欢
    • 2014-01-16
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多