ASP.NET MVC实践系列10-单元测试

简介:

最早接触单元测试是看了极限编程相关资料里边讲的测试驱动开发,然后下载了Nunit研究了一下,但并没产生多大的触动,因为那个时候做的都是些时间紧任务重的事情,对于单元测试的直接感觉就是有可能比较费时间。直到看了《敏捷软件开发:原则、模式与实践》,里边那个保龄球计分程序很精彩,让我知道了保龄球原来是这么计分的,更重要的是让我认识到测试驱动编程原来这样有意义,并且其实并不浪费时间(至于测试驱动编程到底有意义在哪里,我这里就不说了,大家可以参阅Kent的《测试驱动开发》,Robert C. Martin的《敏捷软件开发:原则、模式与实践》,http://www.ibm.com/developerworks/cn/linux/l-tdd/http://www.ibm.com/developerworks/cn/java/j-xp042203/等)。在webform中对web层的逻辑很难做单元测试(当然我们可以利用mvp模式(参考:http://www.cnblogs.com/bluewater/archive/2006/12/11/589214.html#1219888)来分解web层逻辑,但因为没有框架的支持,并且实现起来也不是很简单,也不是特别好理解,所以应用并不广泛)。ASP.NET MVC很好的解决了测试web逻辑的问题,可测试性也变成了ASP.NET MVC的优势之一。下面我们就来介绍一下如何在ASP.NET MVC中进行单元测试。

一、测试路由器:

我们首先利用mvc的模板创建一个解决方案,我们可以在Gloabal.asax.cs文件中发现如下代码

 

ContractedBlock.gif 默认路由代码

 

下面我们就为这段代码写一个单元测试(如果对路由还不清楚请参见:ASP.NET MVC实践系列1-UrlRouting )

 

ContractedBlock.gif 测试代码

 

下面我们解释一下上面的代码

RouteCollection routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

这两行的意思是将routes按照默认路由代码中的格式生成相应的路由。

var httpContextMock = new Mock<HttpContextBase>();
httpContextMock.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/Home/Index");

这两行的意思是创建一个HttpContextBase的mock类,这里我们使用的是MoQ框架来生成mock类(参见:MoQ(基于.net3.5,c#3.0的mock框架)简单介绍 )。

RouteData routeData = routes.GetRouteData(httpContextMock.Object);

这行的意思是从routes中获得路由数据,为下边断言路由中的内容作准备。

Assert.AreEqual("Home", routeData.Values["Controller"]);
Assert.AreEqual("Index", routeData.Values["action"]);
Assert.AreEqual("", routeData.Values["id"]);

这三行分别验证了路由中生成的Controller,action,id的正确性。

二、测试Controller与Action

1、测试ViewData

我们先来看一下ASP.NET MVC的默认模板中的测试代码:

 

ContractedBlock.gif Code

 

我们可以在测试代码中对viewData的内容进行验证,一般并不推荐使用弱类型的viewData来进行传递数据,下面我们来看一下如何来测试viewModel中的内容。

 

ContractedBlock.gif Code

 

2、测试RedirectToAction:

 

ContractedBlock.gif Code

 

三、测试View Helpers

我们常常会把一些牵扯到逻辑的View代码写到Helper中,所以测试Helper非常有意义,我们先写一个简单的Helper

 

ContractedBlock.gif Helper

 

这个Helper的完成的工作是将输入的集合数据分解然后按列表输出。

 

ContractedBlock.gif 测试代码

 

4-9行都是为实例化HtmlHelper做准备的。

四、参考

《Professional ASP.NET MVC 1.0》

《ProASP.NET MVCFramework》

http://msdn.microsoft.com/en-us/magazine/dd942838.aspx

http://www.henrycordes.nl/post/2008/02/MVC-Framework-and-Unit-Test.aspx

http://srtsolutions.com/blogs/patricksteele/archive/2009/08/23/asp-net-mvc-mvc-contrib-unit-testing.aspx

http://weblogs.asp.net/leftslipper/archive/2008/04/13/mvc-unit-testing-controller-actions-that-use-tempdata.aspx

 

 

我的ASP.NET MVC实践系列

ASP.NET MVC实践系列1-UrlRouting

ASP.NET MVC实践系列2-简单应用

ASP.NET MVC实践系列3-服务器端数据验证

ASP.NET MVC实践系列4-Ajax应用

ASP.NET MVC实践系列5-结合jQuery

ASP.NET MVC实践系列6-Grid实现(上)

ASP.NET MVC实践系列7-Grid实现(下-利用Contrib实现)

ASP.NET MVC实践系列8-对查询后分页处理的解决方案

ASP.NET MVC实践系列9-filter原理与实践

其他:

在ASP.NET MVC中对表进行通用的增删改

 

本文转自 你听海是不是在笑 博客园博客,原文链接:http://www.cnblogs.com/nuaalfm/archive/2009/11/26/1611420.html  ,如需转载请自行联系原作者

相关文章
|
10月前
|
自然语言处理 测试技术 C#
NSubstitute:一个简单易用、灵活多变的.NET单元测试模拟框架
NSubstitute是一个开源的.NET单元测试模拟类库,该框架设计的主要目标是提供一个简单明了、易用性强、贴近自然语言的模拟测试框架。它使得开发者能够专注于测试工作,而不是纠结于测试替代实例的创建和配置。
88 5
|
1天前
|
测试技术 C#
.NET单元测试使用Bogus或AutoFixture按需填充的几种方式和最佳实践
【7月更文挑战第13天】AutoFixture 和 Bogus 都是流行的 C#库,用于在单元测试中按需填充测试数据。以下是它们的几种使用方式和最佳实践:一、AutoFixture:1.直接定制 2.使用匿名函数 3.实现ICustomization接口 4.使用Build方法。 二、最佳实践Bogus:1.安装2.使用。
|
2月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
118 0
|
2月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
47 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
184 5
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
|
2月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
|
2月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
64 0
|
2月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
143 0
|
2月前
|
前端开发
net core mvc获取IP地址和IP所在地(其实是百度的)
net core mvc获取IP地址和IP所在地(其实是百度的)
47 0