一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)

前一部分我简单介绍了这个论坛程序的结构(Repository的方法返回IQueryable类型)和在ASP.NET MVC Framework中使用StructureMap。

文章地址:http://www.cnblogs.com/darkdawn/archive/2008/09/23/1297464.html

这一部分我想比较详细的介绍一下MVC中进行TDD的过程和使用Resharper 4.0生成方法(这个活Class Diagram也可以干,不过没Resharper方便)。

我把步骤尽量写得详细一点,这样虽然文章长一点,但是读起来可能没那么费劲。

接着上一个例子,现在我需要读取论坛的分类详细信息。

在TinyForum.Service项目中,利用Class Diagram为IForumService创建了两个方法:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第1张图片

现在代码不能通过编译,因为我的ForumService类并没有实现接口的方法,这时候可以使用Resharper来非常简单的完成这个工作:

把鼠标指向红色下划线上,前面会出现一个红色的灯泡,然后点击灯泡,会看到有实现成员的选项,别犹豫,点下去。

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第2张图片

这时会出来一个对话框,有相应的选项,直接点Finish就行。

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第3张图片

看看都生成了些什么:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第4张图片

很好,这正是我所想要的。是时候该为他们创建单元测试了。在方法名称上点击右键,选择“创建单元测试”。

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第5张图片

然后点击确定,看到VS.NET为该方法生成的单元测试:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第6张图片

这时候我们需要修改这个单元测试,让它能测试一些东西,而现在什么也测试不了,因为我们连一个数据库都没有。没关系,只要有IForumRepository接口的实例就OK了,但是之前我们建立的SqlForumRepository仍然需要数据库的支持。没办法了,只有在测试项目中建立一个只用来测试的IForumRepository了(在测试代码中创建专门为测试使用的Repository,这样做有问题么?)。

首先在测试项目中添加对所有项目的引用,然后建立一个TestForumRepository类,实现IForumRepository,同样利用Resharper生成接口成员:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第7张图片

我们需要一些通用的实体类(非LINQ TO SQL CLASSES)(注意用Class Diagram生成的代码需要修改,setter都是NotImplementedException):

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第8张图片

现在我们需要为这个Repository增加一些测试内容,并实现GetCategory方法:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第9张图片

好了,为这个测试类增加一个IForumService的实例,并修改测试方法:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第10张图片

如图,在类中增加了一个IForumRepository成员,并由TestForumRepository来实例化它,由于Category类是引用类型,有不同的引用,所以我分别测试了它们的内容是否一致,OK,现在运行这个测试,发现没有通过:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第11张图片

因为我们没有实现ForumService.GetCategories方法(抛出System.NotImplementedException异常),现在是时候重构了,修改GetCategory方法:

image

编译,运行测试,第一个测试亮了绿灯,呵呵。

但是这个测试还不够完善,比如,我们没有测试,如果查找的不存在的ID,会有什么结果?这里我希望它能抛出一个自定义异常CategoryNotFoundException,修改Category.cs文件,为它添加一个异常类:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第12张图片

好咯,现在再生成一个测试方法,并修改如下:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第13张图片

我们希望能抛出一个这样的异常,运行这个测试,红灯亮,结果是并没有抛出我所期望的异常,看来我的代码有问题,需要重构:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第14张图片

现在运行测试通过,在找不到数据的时候,会抛出我想要的异常。

下面我想测试一下这个代码是否能在MVC中正常的运行,首先我在Controllers目录下创建一个MVC Controller:ForumController,为这个controller创建一个对IForumService的关联,并在构造器中赋值:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第15张图片

OK,现在在List方法上点击右键,生成测试,并修改测试方法(由于MVC对视图良好的分离,所以我在这里不用关心视图做了什么):

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第16张图片

编译并运行测试,测试没有通过:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第17张图片

原因是我们没有实现List方法,修改代码:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第18张图片

测试又一次失败了,错误信息是“Failed    ListTest    TinyForum.Tests    Test method TinyForum.Tests.ForumControllerTest.ListTest threw exception:  TinyForum.Data.Models.CategoryNotFoundException: Category Not Found..    ”,看来是测试用例有问题(使用new Guid()当然是找不到内容的),修改测试代码,在实例化GUID的时候使用TestForumRepository中成员IList已有的GUID,运行测试,通过。

稍微改进一下测试代码:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第19张图片

开始测试,所有绿灯都亮了:

一个小Forum Web程序示例,ASP.NET MVC Framework,TDD简介(Part 2)_第20张图片 

重复上面的步骤,我继续做了查找Posts的并分页操作(我使用了PagedList<T>来获取分页数据,并在TestForumRepository中加了一些测试数据),这里就不贴出来了。

到这里就差不多了,由于TDD我也处于摸索阶段,可能有很多错误和不足,希望前辈们加以指正。下一部分我将创建一个数据库,并完善一个SqlForumRepository。

你可能感兴趣的:(framework)