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

posted on 2012-01-21 10:41  PetterLiu  阅读(4043)  评论(3编辑  收藏  举报