我试图为我的一个控制器写一个单元测试,以验证视图是否正确返回,但此控制器有一个访问HttpContext.Current.Session的basecontroller。每次我创建一个新的我的控制器的实例是调用basecontroller构造函数和测试失败与一个空指针异常HttpContext.Current.Session。这里是代码:
public class BaseController : Controller { protected BaseController() { ViewData["UserID"] = HttpContext.Current.Session["UserID"]; } } public class IndexController : BaseController { public ActionResult Index() { return View("Index.aspx"); } } [TestMethod] public void Retrieve_IndexTest() { // Arrange const string expectedViewName = "Index"; IndexController controller = new IndexController(); // Act var result = controller.Index() as ViewResult; // Assert Assert.IsNotNull(result,"Should have returned a ViewResult"); Assert.AreEqual(expectedViewName,result.ViewName,"View name should have been {0}",expectedViewName); }
任何想法如何模拟(使用Moq)在基本控制器中访问的会话,以便后代控制器中的测试将运行?
解决方法
如果你使用
Typemock,你可以这样做:
Isolate.WhenCalled(()=>controller.HttpContext.Current.Session["UserID"]) .WillReturn("your id");
测试代码将如下所示:
[TestMethod] public void Retrieve_IndexTest() { // Arrange const string expectedViewName = "Index"; IndexController controller = new IndexController(); Isolate.WhenCalled(()=>controller.HttpContext.Current.Session["UserID"]) .WillReturn("your id"); // Act var result = controller.Index() as ViewResult; // Assert Assert.IsNotNull(result,"Should have returned a ViewResult"); Assert.AreEqual(expectedViewName,expectedViewName); }