一起谈.NET技术,在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类用于测试控制器。


using NUnit.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

时间: 2024-10-24 16:48:00

一起谈.NET技术,在ASP.NET MVC中进行TDD开发的相关文章

一起谈.NET技术,ASP.NET MVC中对数据进行排序的方法

本系列是讲解如何在asp.net mvc中对数据进行展示.排序.分页等的系列文章.在上周的文章中,一步一步教会了大家如何使用ASP.NET MVC框架去的展示数据.在上周的文章中,我们先用Visual Studio创建了一个新的ASP.NET MVC应用程序,接着连接到了Northwind数据库,并展示了如何使用微软的LINQ-SQL的工具去访问数据库中的数据,接着指导如何去实现视图层去展示产品信息及如何设计控制器. 本文是在上一篇文章的例子基础上,展示了如何去实现数据的双向排序.如果你是已经熟

一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法

在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的.当时很纠结,因为刚接触Asp.net MVC,故没有找到解决方案.这篇文章将给出解决的办法.看下面需要验

一起谈.NET技术,ASP.NET MVC中实现多个按钮提交的几种方法

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能.   如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 方法一:使用客户端脚本 比如我们在View中这样写: 代码 <inputtype="submit"value="审核通过"onclick='this.form.action="<%=Url.Action("Action1&q

一起谈.NET技术,ASP.NET MVC中的Json Binding和Validate

电子商务网站支付功能页面往往会有很多信息,对于这些信息的保存,往往是分步完成的,那么使用Ajax最合适不过了,比如其中的收货人信息模块.这些信息的新建和编辑保存都是用Ajax来完成的.那么有几种方式完成这个操作呢,我想到如下几种. 先来看看该功能的截图: 一般情况下这些信息会对应一个实体类,就命名为:ReceiverInfo,简单起见,我定义ReceiverInfo如下: 1.将需要的值拼接成json文本,再Action里面处理 首先您需要将要保存的值拼接成一个json文本,类似: var te

在ASP.NET MVC中进行TDD开发

TDD介绍 TDD是一种开发方法,全称是Test-Driven development,中文是测试驱动开发.作者是Kent Beck.首先让我介绍一下三种常见的开发方式: 第一种:先Coding,然后Bug Fix. 第二种:先Coding,然后Unit Test,最后Bug Fix.很显然用了单元测试的比第一种开发方式要好不少. 第三种:就是本文要说的TDD,它的方式和第二种恰恰相反.TDD先设计单元测试,然后再Coding,最后修复Bug.看下图: TDD开发过程可以看成:给制自己制定一个目

一起谈.NET技术,ASP.NET MVC 2生成动态表单的一种最简单的思路

在BPM.OA等系统中,都会存在一个表单设计器.有些是通过操作gridview来完成一个表单的设计:有些是通过类似VS拖拽的方法完成一个表单的设计.很明显后面一种优越于前面一种.无论是哪种,最后都会产生一些XML之类的表单结构的数据. 这篇文章将讲述,在表单设计器设计好表单之后,在ASP.NET MVC中如何将表单结构的xml转换成实际应用系统中的表单.看下面一个xml文件,我们假设它是由一个表单设计器设计出来的. <?xml version="1.0" encoding=&qu

一起谈.NET技术,ASP.NET MVC 2示例Tailspin Travel UI层分析

Tailspin Travel 是一个旅游预订的应用程序示例,最新版本采用ASP.NET MVC 2技术构建,主要使用 DataAnnotations 验证, 客户端验证和ViewModels,还展示了许多Visual Studio 2010, .NET Framework 4, 和Windows Server AppFabric的技术,参看ASP.NET MVC 2示例Tailspin Travel. Tailspin Travel设计的技术比较多,今天我们来看看界面(UI)上的技术,在UI层

一起谈.NET技术,ASP.NET MVC &amp;amp; EF 构建智能查询 二、模型的设计与ModelBinder

在第一篇中,我讲解了我们要做智能查询的原因,以及基本的解决方案设计.从这篇开始我们开始讲解它的实现过程. 其实在写这一系列文章之初,我其实是想由底至上去讲解,但是我又整理了一遍代码才发现,其实如果不了解最表面的东西,也是不太好深入的. 所以我们的第二篇文章就来讲一下我们这个智能查询框架中最浅,但也是使用最频繁的部分,也就是Model. 首先我们的Entity  或者说数据库的结构如下: 另外如下面代码,我们有一个用于传递name=value对,及查询谓词的model: public Action

一起谈.NET技术,ASP.NET MVC 2扩展点之Model Binder

Model Binder在Asp.net MVC中非常简单.简单的说就是你控制器中的Action方法需要参数数据:而这些参数数据包含在HTTP请求中,包括表单上的Value和URL中的参数等.而ModelBinder的功能就是将这些个表单上的Value和URL中的参数换成对象,然后将这些对象绑定到Action的参数上面.我简单的画了一个图,看起来会更加直观. 在asp.net mvc中你可以写类似下面这样的代码: [HttpPost]public ActionResult Create(){Bo