Asp.net MVC 3 應用程序中,單元測試對項目的質量意義重大。除了對Model,Controller進行單元測試,有時還需要對View也進行。對View進行測試目前並不容易做,大多數情況下可能做的是BlackBox測試。現在可以使用Razor Generator簡化對Razor View單元測試。你可以從這里安裝 VS2010的擴展。
然后在VIEW上右鍵屬性,對Custom Tool 使用Razor Generator,如下圖,它就生成一個對應名稱的Class, 文件與View在同一位置。
然后我們看這個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。

