在ASP.NET MVC中进行TDD开发

简介:

TDD介绍

TDD是一种开发方法,全称是Test-Driven development,中文是测试驱动开发。作者是Kent Beck。首先让我介绍一下三种常见的开发方式:

第一种:先Coding,然后Bug Fix。

第二种:先Coding,然后Unit Test,最后Bug Fix。很显然用了单元测试的比第一种开发方式要好不少。

三种:就是本文要说的TDD,它的方式和第二种恰恰相反。TDD先设计单元测试,然后再Coding,最后修复Bug。看下图:

hkkk

TDD开发过程可以看成:给制自己制定一个目标,然后努力去完成这个目标。下面是这个比喻对应关系。斜杠前面的是TDD,斜杠后面的是完成目标:

1、写一个测试  /  制定一个目标

2、编译     / 了解完成目标的标准

3、运行测试,结果失败  /   目标没有达成

4、修改代码    /     为了完成目标,不停奋斗

5、再次运行测试,结果通过  /    目标达成。

这个说明应该比较形象啦。

下面我们看下真正的TDD循环,如下图所示:

ppp

TDD循环:

第一步:写测试类,然后拿去编译。

第二步:将编译生成好的dll之类的拿去测试,测试失败。

第三步:失败之后,就去修改测试的代码,直到测试通过。

第四步:测试成功之后,去重构你的代码,增加代码的可读性,但不能改变程序的任何功能。重构代码之后还需要测试,必须测试成功为止。

这四个步骤之后,在从写测试类重新开始其他的功能。

ASP.NET MVC中进行TDD开发

下面用一个在asp.net mvc2 中进行一次简单的TDD开发实战。单元测试我使用NUnit。

新建一个你类库项目命名为Test.Unit。再建一个asp.net mvc2的项目。项目结构如下图:

kkk

首先进行第一步,写测试确定要实现什么:我们实现一个数据列表的显示。

在类库项目中添加一个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循环的的第二步。

nnn

因为Index中没有返回任何的数据,所有才会测试失败。修改Index方法,代码如下。

public class TodoController : Controller
{
    //
    // GET: /Todo/

    public ActionResult Index()
    {
        ViewData.Model = Todo.ThingsToBeDone;
        return View();
    }

}

编译继续测试,发现测试通过。对应上文的第三步。

kkkkk

这个例子非常简单,也就用不着去重构代码,所以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,如需转载请自行联系原作者

相关文章
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
862 3
|
设计模式 开发框架 JavaScript
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
459 0
|
12月前
|
人工智能 芯片
D1net阅闻|OpenAI员工疯狂暗示,内部已成功开发ASI?被曝训出GPT-5但雪藏
D1net阅闻|OpenAI员工疯狂暗示,内部已成功开发ASI?被曝训出GPT-5但雪藏
|
10月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
415 0
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
527 12
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
240 9
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
214 8
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
207 7
|
网络协议 C#
基于.NET WinForm开发的一款硬件及协议通讯工具
基于.NET WinForm开发的一款硬件及协议通讯工具
170 7
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
474 5