zoukankan      html  css  js  c++  java
  • 一个小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创建了两个方法:

    image

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

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

    image

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

    image

    看看都生成了些什么:

    image

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

    image

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

    image

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

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

    image

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

    image

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

    image

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

    image

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

    image

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

    image

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

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

    image

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

    image

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

    image

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

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

    image

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

    image

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

    image

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

    image

    测试又一次失败了,错误信息是“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,运行测试,通过。

    稍微改进一下测试代码:

    image

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

    image 

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

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

  • 相关阅读:
    MapInfo 文件格式说明
    一个经典编程面试题的“隐退”
    Polar 投影c#版本移植
    关于 tf.nn.softmax_cross_entropy_with_logits 及 tf.clip_by_value
    系列解读Dropout
    python删除所有的中文字符、非ASCII或非英文字符,检查字符串是否包含非ASCII
    Python使用split使用多个字符分隔字符串
    Convolutional Neural Networks for Visual Recognition
    【TensorFlow】tf.nn.conv2d是怎样实现卷积的?
    [TensorFlow] tf.nn.softmax_cross_entropy_with_logits的用法
  • 原文地址:https://www.cnblogs.com/darkdawn/p/1298391.html
Copyright © 2011-2022 走看看