zoukankan      html  css  js  c++  java
  • Asp.net MVC中使用Razor Generator实现View的单元测试

           Asp.net MVC 3 应用程序中,单元测试对项目的质量意义重大。除了对Model,Controller进行单元测试,有时还需要对View也进行。对View进行测试目前并不容易做,大多数情况下可能做的是BlackBox测试。现在可以使用Razor Generator简化对Razor View单元测试。你可以从这里安装 VS2010的扩展。

          然后在VIEW上右键属性,对Custom Tool 使用Razor Generator,如下图,它就生成一个对应名称的Class, 文件与View在同一位置。

          image

    然后我们看这个Class是这样的:

        [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "1.3.0.0")]
        [System.Web.WebPages.PageVirtualPathAttribute("~/Views/Home/TestViewInOutTime.cshtml")]
        public class TestViewInOutTime : System.Web.Mvc.WebViewPage<dynamic>
        {
            public TestViewInOutTime()
            {
            }
            public override void Execute()
            {
    
                
                #line 1 "..\..\Views\Home\TestViewInOutTime.cshtml"
      
        Layout = null;
    
    
                
                #line default
                #line hidden
    WriteLiteral("\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <title>TestViewInOutTime</title>\r\n</head" +
    ">\r\n<body>\r\n    <div>\r\n        <h1 id=\"titleOne\">This is your life</h1>\r\n    </di" +
    "v>\r\n</body>\r\n</html>\r\n");
    
    
            }
        }

    这个View的内容是:

    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <title>TestViewInOutTime</title>
    </head>
    <body>
        <div>
            <h1 id="titleOne">This is your life</h1>
        </div>
    </body>
    </html>
    


    好的,接下来在你的单元测试项目中使用NuGet安装RazorGenerator.Testing, 它有下面的依赖组件同是安装:

    HtmlAgilityPack

    Moq

    ReflectionMagic


    接着我们就可以写这样的单元测试代码。

    [TestMethod]
    public void TestGetGivenIdInnerHtmlFromViews()
    {
        //arrange
        var views = new TestViewInOutTime();
    
        //act
        HtmlDocument doc = views.RenderAsHtml();
        HtmlNode node = doc.GetElementbyId("titleOne");
    
        //assert
        Assert.IsNotNull(node);
        Assert.AreEqual("This is your life", node.InnerHtml.Trim());
    }


    上面的代码您可能看到把当前View Render以后是一个HtmlDocument,这是HtmlAgilityPack中的类。HtmlAgilityPack是一个解析HTML的类库。

    然后我们找到titleOne的结点比较的它的InnerHtml。那么对PartialView同样也可以:

    Tel.cshtml内容是这样的:
    021-77677878

    代码是这样的:

    [TestMethod]
    public void TestPartialView()
    {
        //arrange
        var views = new Tel();
    
        //act
        HtmlDocument doc = views.RenderAsHtml();
    
        //assert
        Assert.IsNotNull(doc);
        Assert.AreEqual("021-77677878", doc.DocumentNode.InnerText);
    }


    对Views的UnitTest本来就是棘手的事儿,因为View是在运行时编译的。但 Razor Generator 直接生成View类以方便我们测试它。那什么样产景下我们需要对View进行单元测试呢?有时我们没有必要比较整个输出的Html, 只需要比较是关键的某一段Html即可。

    希望对您开发有帮助。


    作者:Petter Liu
    出处:http://www.cnblogs.com/wintersun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-Petter Liu Blog

  • 相关阅读:
    Flowable学习笔记(二、BPMN 2.0-基础 )
    Flowable学习笔记(一、入门)
    只有程序员才懂的幽默
    Navicat自动备份数据库
    两个原因导致Spring @Autowired注入的组件为空
    设计模式—— 十二 :代理模式
    设计模式—— 十 一:建造者模式
    SpringBoot学习笔记(十一:使用MongoDB存储文件 )
    Swagger API文档集中化注册管理
    Spring Boot2从入门到实战:集成AOPLog来记录接口访问日志
  • 原文地址:https://www.cnblogs.com/wintersun/p/2328421.html
Copyright © 2011-2022 走看看