我试图为我的一个控制器写一个单元测试,以验证视图是否正确返回,但此控制器有一个访问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);
- }