c# – 在单元测试期间渲染视图 – ControllerContext.DisplayMode

前端之家收集整理的这篇文章主要介绍了c# – 在单元测试期间渲染视图 – ControllerContext.DisplayMode前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在研究一个生成大而复杂的报告的ASP.NET MVC 4 Web应用程序.我想编写单元测试来渲染视图,以确保视图不会爆炸,具体取决于模型:
  1. [Test]
  2. public void ExampleTest(){
  3. var reportModel = new ReportModel();
  4.  
  5. var reportHtml = RenderRazorView(
  6. @"..\..\Report.Mvc\Views\Report\Index.cshtml",reportModel);
  7.  
  8. Assert.IsFalse(
  9. string.IsNullOrEmpty(reportHtml),"View Failed to Render!");
  10. }
  11.  
  12. public string RenderRazorView(string viewPath,object model){
  13. //WHAT GOES HERE?
  14. }

我已经在网络上看到了很多有关这方面的信息,但它要么反对测试竞争,要么只能在Web请求的上下文中使用.

> Arguing Against – Unit Testing the Views? – 结论是视图中没有逻辑,所以你只需要测试编译.我认为测试View是有价值的,以确保没有Null引用异常,显示正确的部分等.
> Web请求的上下文 – Render a view as a string – 这是为了呈现要在电子邮件中发送的视图.但是这种方法需要通过Web请求(即有效的HttpContextBase)进行调用.

我一直在努力使Render a view as a string适应Mocked HttpContextBase,但在使用Mocked ControllerContext时遇到了问题:

Object reference not set to an instance of an object.
at System.Web.WebPages.DisplayModeProvider.GetDisplayMode(HttpContextBase context)
at System.Web.Mvc.ControllerContext.get_DisplayMode()
at System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext,String[] locations,String[] areaLocations,String locationsPropertyName,String name,String controllerName,String cacheKeyPrefix,Boolean useCache,String[]& searchedLocations)

这是我到目前为止的代码

  1. public string RenderRazorView(string viewPath,object model)
  2. {
  3. var controller = GetMockedDummyController();
  4.  
  5. //Exception here
  6. var viewResult =
  7. ViewEngines.Engines.FindView(controller.ControllerContext,"Index","");
  8.  
  9. using (var sw = new StringWriter())
  10. {
  11. var viewContext =
  12. new ViewContext(
  13. controller.ControllerContext,viewResult.View,new ViewDataDictionary(model),new TempDataDictionary(),sw);
  14.  
  15. viewResult.View.Render(viewContext,sw);
  16.  
  17. return sw.ToString();
  18. }
  19. }

我正在构建控制器:

  1. private Controller GetMockedDummyController()
  2. {
  3. var HttpContextBaseMock = new Mock<HttpContextBase>();
  4. var HttpRequestMock = new Mock<HttpRequestBase>();
  5. var HttpResponseMock = new Mock<HttpResponseBase>();
  6. HttpContextBaseMock.SetupGet(x => x.Request).Returns(HttpRequestMock.Object);
  7. HttpContextBaseMock.SetupGet(x => x.Response).Returns(HttpResponseMock.Object);
  8.  
  9. var controller = new DummyController();
  10.  
  11. var routeData = new RouteData();
  12. routeData.Values.Add("controller","Dummy");
  13.  
  14. controller.ControllerContext =
  15. new ControllerContext(
  16. HttpContextBaseMock.Object,routeData,controller);
  17.  
  18. controller.Url =
  19. new UrlHelper(
  20. new RequestContext(
  21. HttpContextBaseMock.Object,routeData),new RouteCollection());
  22.  
  23. return controller;
  24. }

DummyController只是公共类DummyController:Controller {}

提供View的路径,如何从Test项目将其呈现为HTML?或者更具体地说,我如何模拟出ControllerContext.DisplayMode?

解决方法

假设您完全分离了关注点,是否有必要实例化控制器?如果没有,那么也许您可以使用 RazorEngine来测试您的视图.
  1. var contents = File.ReadAllText("pathToView");
  2. var result = Razor.Parse(contents,model);
  3. // assert here

猜你在找的C#相关文章