如何对剃刀视图进行单元测试

Nil*_*ils 8 asp.net-mvc unit-testing razor

他写道,当Scott Guthrie 第一次在Razor上博客时

新的视图引擎实现将支持单元测试视图的能力(无需控制器或Web服务器,并且可以托管在任何单元测试项目中 - 无需特殊的app-domain).

但是,我找不到关于剃刀可测试性的其他声明(或示例).有指向使用CodelanguageServieRazorGenerator一些自制的渲染器 - 我称之为"设计".

目前是否可以通过简单的方式对剃刀视图进行单元测试?(在asp.net mvc应用程序中,即.Nancy Nx在它的nancy.testing-package中带来了可测试性.)

(目前我不在乎是否应该测试视图.)

我知道有很多像这样的问题,但大多数问题都比较陈旧......

小智 1

我认为您可以对任何 Razor 视图进行单元测试,如下所示:

ViewResult v = View("~/Views/Home/Index.cshtml");
            if (string.IsNullOrEmpty(v.ViewName))
                v.ViewName = RouteData.GetRequiredString("action");
            ViewEngineResult result = null;
            StringBuilder sb = new StringBuilder();
            StringWriter textwriter = new StringWriter(sb);
            HtmlTextWriter htmlwriter = new HtmlTextWriter(textwriter);
            if (v.View == null)
            {
                result = new ViewEngineResult(new RazorView(ControllerContext,"~/Views/Home/Index.cshtml", null,false,null), new RazorViewEngine());
                v.View = result.View;
            }
            ViewContext viewContext = new ViewContext(ControllerContext, v.View, ViewData, TempData, htmlwriter);
            v.View.Render(viewContext, htmlwriter);
            string html = sb.ToString();
Run Code Online (Sandbox Code Playgroud)

之后,您可以解析 html 以检查内容是否符合规范。

  • 该建议仍然需要一个控制器,包括具有提供的各种属性的控制器上下文。虽然它们可以在某种程度上被模拟,但此代码(在使用有效 HttpContext.Current 运行的控制器之外)会遇到“System.Web.Compilation.BuildManager.GetCacheKeyFromVirtualPath(VirtualPath virtualPath, Boolean& keyFromVPP)”中的 NRE (NullReferenceException) 。因此,继续寻找一种简单的方法来测试视图,例如“RazorView.Render(string viewName, object model)”之类的实现。视图/部分似乎仍然不可测试。 (4认同)