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()
{//arrangevar views = new TestViewInOutTime();//actHtmlDocument doc = views.RenderAsHtml();HtmlNode node = doc.GetElementbyId("titleOne");//assertAssert.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()
{//arrangevar views = new Tel();//actHtmlDocument doc = views.RenderAsHtml();//assertAssert.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。

Asp.net MVC中使用Razor Generator实现View的单元测试相关推荐

  1. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  2. 如何在 ASP.NET MVC 中集成 AngularJS

    介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...

  3. 获取ASP.NET MVC中的完整操作URL [重复]

    本文翻译自:Getting full URL of action in ASP.NET MVC [duplicate] This question already has an answer here ...

  4. 通过源代码研究ASP.NET MVC中的Controller和View(二)

    通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...

  5. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  6. ASP.NET MVC中你必须知道的13个扩展点

         ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...

  7. Asp.net mvc中的Ajax处理

    在Asp.net MVC中的使用Ajax, 可以使用通用的Jquery提供的ajax方法,也可以使用MVC中的AjaxHelper. 这篇文章不对具体如何使用做详细说明,只对于在使用Ajax中的一些需 ...

  8. 在 ASP.NET MVC 中使用 Chart 控件

    在 .NET 3.5 的时候,微软就提供了一个 Chart 控件,网络上有大量的关于在 VS2008 中使用这个控件的文章,在 VS2010 中,这个控件已经被集成到 ASP.NET 4.0 中,可以 ...

  9. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    在ASP.NET MVC中使用IIS级别的URL Rewrite 原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的 ...

最新文章

  1. Jackson学习笔记(三)转
  2. 最小生成树实验报告c语言,算法与程序设计实验最小生成树(c语言).ppt
  3. 数字图像处理目录列表
  4. python小技巧:获取字典中值最大者的key
  5. HD_1166敌兵布阵
  6. ios 不同的数据类型转化为json类型
  7. 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动 8
  8. 一种替代的多生产者方法
  9. unzip不能解压mysql的zip_Linux中zip压缩和unzip解压缩命令详解
  10. Python面试题-交换两个数字的三种方法
  11. macOS Safari使用EasyConnect插件的坑
  12. javaWeb实现裁剪图片上传整套方案
  13. AHRS(航姿参考系统)和IMU(惯性测量单元)的区别
  14. 自动化测试之Appium
  15. ios APP加密探究几维安全iOS 代码混淆效果参考
  16. 卫生事业单位计算机科学与技术,卫生事业单位考试-计算机科学与技术的知识点.doc...
  17. 不要使用矿泉水瓶接热水喝——致癌
  18. XSS和CSRF两种跨站攻击比较
  19. 【拓展】编程语言中的“前浪”和“后浪”
  20. Cisco 9100系列AP清空配置

热门文章

  1. python将object转换为float_如何在python中将datatype:object转换为float64?
  2. java中Assert使用
  3. Win32 Application 、Win32 Console Application、MFC工程项目
  4. VSCode + PYQT5 + QtDesigner
  5. 26所高校联合建议:尽快设置人工智能本科专业
  6. 百度“追杀”66天后,景驰CEO王劲离职,原CTO韩旭接任
  7. 对话彭军、楼教主:1.12亿美元融资来了,Pony.ai车队也已在路上 | 变局者
  8. 离模拟世界又近一步!谷歌推出开源量子计算平台OpenFermion
  9. 苹果自动驾驶测试车近距离实拍,头顶新添传感器和硬件
  10. 摩拜前端周刊第10期