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

  • 相关阅读:
    USACO 3.3 A Game
    USACO 3.3 Camelot
    USACO 3.3 Shopping Offers
    USACO 3.3 TEXT Eulerian Tour中的Cows on Parade一点理解
    USACO 3.3 Riding the Fences
    USACO 3.2 Magic Squares
    USACO 3.2 Stringsobits
    USACO 3.2 Factorials
    USACO 3.2 Contact
    USACO 3.1 Humble Numbers
  • 原文地址:https://www.cnblogs.com/wintersun/p/2328421.html
Copyright © 2011-2022 走看看