asp.net-mvc – ASP.NET MVC单元测试控制器与HttpContext

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC单元测试控制器与HttpContext前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图为我的一个控制器写一个单元测试,以验证视图是否正确返回,但此控制器有一个访问HttpContext.Current.Session的basecontroller。每次我创建一个新的我的控制器的实例是调用basecontroller构造函数和测试失败与一个空指针异常HttpContext.Current.Session。这里是代码
  1. public class BaseController : Controller
  2. {
  3. protected BaseController()
  4. {
  5. ViewData["UserID"] = HttpContext.Current.Session["UserID"];
  6. }
  7. }
  8.  
  9. public class IndexController : BaseController
  10. {
  11. public ActionResult Index()
  12. {
  13. return View("Index.aspx");
  14. }
  15. }
  16.  
  17. [TestMethod]
  18. public void Retrieve_IndexTest()
  19. {
  20. // Arrange
  21. const string expectedViewName = "Index";
  22.  
  23. IndexController controller = new IndexController();
  24.  
  25. // Act
  26. var result = controller.Index() as ViewResult;
  27.  
  28. // Assert
  29. Assert.IsNotNull(result,"Should have returned a ViewResult");
  30. Assert.AreEqual(expectedViewName,result.ViewName,"View name should have been {0}",expectedViewName);
  31. }

任何想法如何模拟(使用Moq)在基本控制器中访问的会话,以便后代控制器中的测试将运行?

解决方法

如果你使用 Typemock,你可以这样做:
  1. Isolate.WhenCalled(()=>controller.HttpContext.Current.Session["UserID"])
  2. .WillReturn("your id");

测试代码将如下所示:

  1. [TestMethod]
  2. public void Retrieve_IndexTest()
  3. {
  4. // Arrange
  5. const string expectedViewName = "Index";
  6.  
  7. IndexController controller = new IndexController();
  8. Isolate.WhenCalled(()=>controller.HttpContext.Current.Session["UserID"])
  9. .WillReturn("your id");
  10. // Act
  11. var result = controller.Index() as ViewResult;
  12.  
  13. // Assert
  14. Assert.IsNotNull(result,"Should have returned a ViewResult");
  15. Assert.AreEqual(expectedViewName,expectedViewName);
  16. }

猜你在找的asp.Net相关文章