C# 单元测试我的MVC4控制器操作方法,其中检查会话是否为null

C# 单元测试我的MVC4控制器操作方法,其中检查会话是否为null,c#,unit-testing,asp.net-mvc-4,session,nunit,C#,Unit Testing,Asp.net Mvc 4,Session,Nunit,我已经开始学习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 !=

我已经开始学习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方法,但由于会话[“Admin”]为null,它抛出NullReference异常。谁能告诉我如何运行上述测试方法。谢谢

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

使用System.Web;
使用最小起订量;
[测试夹具]
公共类管理员测试
{
[测试]
公共作废编辑()
{
var mockSession=new Mock();
mockSession.Setup(f=>f[“admin]”)。返回(()=>“yesToAdmin”);
var mockContext=new Mock();
Setup(f=>f.Session).Returns(mockSession.Object);
AdminController admin=新的AdminController();
admin.ControllerContext=新的ControllerContext()
{
控制器=管理员,
RequestContext=new RequestContext(mockContext.Object,new RoutedData())
};
var id=admin.Edit(3)作为ViewResult;
Assert.AreEqual(“编辑”,id.ViewName);
}
}

我从NUGET添加了MOQ引用,甚至在我的测试项目中添加了名称空间,但我收到了以下警告:“找不到类型或名称空间名称‘HttpSessionStateBase’(是否缺少using指令或程序集引用?)。尝试通过谷歌搜索,但没有结果尝试添加对System.Web的引用,我将更新Answer。这就是您缺少的,对此的引用。您需要检查您的项目以及代码是否引用了它。有大量的资源在SO和通过谷歌,将帮助您解决这个问题。
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);
    }
}