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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM