C# 单元测试我的MVC4控制器操作方法,其中检查会话是否为null
我已经开始学习MVC4中的单元测试,并有了一个项目,我正在尝试使用NUnit框架测试用例。下面是我的控制器操作方法: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 !=
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);
}
}