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。