在ASP.NET MVC中进行TDD开发
TDD介绍
TDD是一种开发方法,全称是Test-Driven development,中文是测试驱动开发。作者是Kent Beck。首先让我介绍一下三种常见的开发方式:
第一种:先Coding,然后Bug Fix。
第二种:先Coding,然后Unit Test,最后Bug Fix。很显然用了单元测试的比第一种开发方式要好不少。
第三种:就是本文要说的TDD,它的方式和第二种恰恰相反。TDD先设计单元测试,然后再Coding,最后修复Bug。看下图:
TDD开发过程可以看成:给制自己制定一个目标,然后努力去完成这个目标。下面是这个比喻对应关系。斜杠前面的是TDD,斜杠后面的是完成目标:
1、写一个测试 / 制定一个目标
2、编译 / 了解完成目标的标准
3、运行测试,结果失败 / 目标没有达成
4、修改代码 / 为了完成目标,不停奋斗
5、再次运行测试,结果通过 / 目标达成。
这个说明应该比较形象啦。
下面我们看下真正的TDD循环,如下图所示:
TDD循环:
第一步:写测试类,然后拿去编译。
第二步:将编译生成好的dll之类的拿去测试,测试失败。
第三步:失败之后,就去修改测试的代码,直到测试通过。
第四步:测试成功之后,去重构你的代码,增加代码的可读性,但不能改变程序的任何功能。重构代码之后还需要测试,必须测试成功为止。
这四个步骤之后,在从写测试类重新开始其他的功能。
ASP.NET MVC中进行TDD开发
下面用一个在asp.net mvc2 中进行一次简单的TDD开发实战。单元测试我使用NUnit。
新建一个你类库项目命名为Test.Unit。再建一个asp.net mvc2的项目。项目结构如下图:
首先进行第一步,写测试确定要实现什么:我们实现一个数据列表的显示。
在类库项目中添加一个nunit.framework引用,然后再设计一个TodoControllerTest类用于测试控制器。
usingNUnit.Framework;
namespaceTest.Unit
{
[TestFixture]
public classTodoControllerTest
{
[Test]
public voidShould_Display_A_List_Of_Todo_Items()
{
}
}
}
这个测试类用于测试Todo控制器,它需要数据实体。所以我们要在asp.net mvc 项目中添加Model。在Model添加下面实体:
public class Todo {public static List<Todo> ThingsToBeDone = new List<Todo>{new Todo {Title = "Get Milk", Completed = false},new Todo {Title = "Bring Home Bacon", Completed = false}};public bool Completed { get; set; }public string Title { get; set; } }
我们修改TodoCpmtroller,代码如下:
[TestFixture] public class TodoControllerTest {[Test]public void Should_Display_A_List_Of_Todo_Items(){var viewResult = (ViewResult)new TodoController().Index();Assert.AreEqual(Todo.ThingsToBeDone, viewResult.ViewData.Model); }}
测试TodoCpmtroller中的Index方法返回的数据是否与Todo的ThingsToBeDone相同,而此时我们还没有在MVC项目中添加TodoController类和Index方法。
故我们需要在MVC项目中添加TodoController类,代码如下:
public class TodoController : Controller {//// GET: /Todo/public ActionResult Index(){return View();}}
我们编译项目发现没有错误。
使用Nunit进行测试,发现测试不通过,这对应TDD循环的的第二步。
因为Index中没有返回任何的数据,所有才会测试失败。修改Index方法,代码如下。
public class TodoController : Controller {//// GET: /Todo/public ActionResult Index(){ViewData.Model = Todo.ThingsToBeDone;return View();}}
编译继续测试,发现测试通过。对应上文的第三步。
这个例子非常简单,也就用不着去重构代码,所以TDD循环的第四步可以省去。然后接着下一轮的循环。
总结:本文首先简单的介绍了一下TDD,随后在asp.net mvc中进行了实战。
参考:Test-Drive ASP.NET MVC
本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/08/02/Test-Drive-IN-ASP-NET-MVC.html,如需转载请自行联系原作者
在ASP.NET MVC中进行TDD开发相关推荐
- ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
AJAX的好处就是不会堵塞页面,可以提高用户体验,可以减少数据传输尺寸,提高应用程序的性能.目前,AJAX技术可以说是已经成为WEB开发的标准技术. AJAX技术是纯客户端技术,任何客户端框架(如:M ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 如何在 ASP.NET MVC 中集成 AngularJS
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...
- [MVC]Asp.net MVC中的Session
[MVC]Asp.net MVC中的Session 2008年12月9日 分类: ASP.NET, ASP.NET MVC, C#, 开发笔记 最近使用ASP.NET MVC 中的Controller ...
- 在 ASP.NET MVC 中创建自定义 HtmlHelper
在ASP.NET MVC应用程序的开发中,我们常碰到类似Html.Label或Html.TextBox这样的代码,它将在网页上产生一个label或input标记.这些HtmlHelper的扩展方法有些 ...
- 通过源代码研究ASP.NET MVC中的Controller和View(二)
通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...
- 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证
在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...
- ASP.NET MVC中你必须知道的13个扩展点
ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...
最新文章
- 数据变异性的度量 - 极差、IQR、方差和标准偏差
- linux网络编程-posix信号量与互斥锁(39)
- Openstack Nova 源码分析 — 使用 VCDriver 创建 VMware Instance
- golang struct 转map 及 map[string]*Struct 初始化和遍历
- java 多个 panel_在Java中,每次我向JPanel添加多个东西时,第二...
- IOS之代理的使用(重点)
- codeforces 1060a(思维水题)
- myeclipse编程技巧--中编辑器输入任何字母都出现提示功能
- [C语言 - 13] 运算符
- 浅谈大比例尺数字地形图的缩编方法
- 塔菲克蓝牙适配器驱动_TAFIQ蓝牙适配器驱动下载|TAFIQ蓝牙适配器驱动 v4.0 最新免费版 下载 - 巴士下载站...
- 动画:用动画给面试官解释 TCP 三次握手过程
- 简述osi参考模型各层主要功能_简述OSI参考模型定义及各层的主要功能
- 看了这些 Go2 错误处理的提案,我真的会谢
- 前后端交互node服务器
- Java 如何把gb2312编码转化为汉字(互转)
- MpAndroidChart饼图
- linux主分区扩容
- 想做游戏场景建模师,如何拿到高薪资?
- 2020年中国全国5级行政区划(省、市、县、镇、村)
热门文章
- linux创建分区_在Linux中创建分区-分步指南
- dax圣经 翻新_使用翻新和Node JS的Android图像上传
- 免费下载谷歌maps软件_Android Google Maps当前位置,夜间模式功能
- iOS UISearchController和UITableView
- json 例子_json-简单的例子
- mac系统安装python(2.7)requests库
- Java基础之如何修改字符串?
- abp 基于api接口的页面内容提交
- mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting
- samba访问其他服务器文件权限设置