IProductRepository接口定义了一个仓库,我们通过它获得、更新Product对象。IPriceReducer接口指定了一个功能,它将要对所有的Products实施,通过一个参数,降低他们的价格。

在这个例子中,我们的目的是创建一个IProductReducer的实现,它有以下功能:

  • 仓库中所有Product的价格都要减
  • 仓库的UpdateProduct方法可以被每个Product对象调用
  • 价格不能低于1

为了帮助我们建立实现,我们创建一个FakeRepository类,它实现了IProductRepository接口。

在ReducePrice方法上点右键,选择创建单元测试,在弹出对话框中选中要测试的方法,确定。单元测试会新建一个项目。

这里用到Enumerable.Zip<TFirst, TSecond, TResult> 方法。下面有一个列子:

// 3 three

像拉链一样,对比两个集合中,相同Index的元素。

}

这是我们第一个单元测试,它包含我们让VS查看的属性。TestClass属性被应用到类上,TestMethod属性被用在任何包含一个单元测试的方法上。被VS忽略的方法不用包含此属性。

你看到我们的单元测试方法遵循arrange/act/asert(A/A/A)模式。我们的单元测试方法叫做All_Prices_Are_Changed,通过Linq查询,调用ToArray得到FakeRepository类中包含的Product items的初始单价。然后,我们调用目标方法,使用Linq Zip方法,确保每个方法都改变了。如果任何元素没有改变,我们调用Asset.Fail方法,单元测试不及格。

建立单元测试有很多不同的方法,这里有一个公共的方法,用一个单一且伟大的方法,测试所有的必须条件。我们更喜欢创建一些小的单元测试,每个值关注程序的一方面。我们的偏爱来自两个原因,第一个是当一个小的单元测试不及格,你会准确地知道你代码中的欠缺。第二个原因是在我们查看了所有测试原因后,倾向于在多个测试方法中以破旧的代码结束,我们比代码中关注的更多,但是我们找到一个简洁的程序A/A/A模式。

}

这些方法都遵循相同的模式。我们创建一个FakeRepository对象,并手工将它注入到MyPriceReducer类的构造器中。然后调用ReducePrices方法,使用Assert类的方法检查结果。下面你可能用到的静态方法,来检查或报告测试的状态。

Method Description
AreEqual<T>(T,T) AreEqual<T>(T,T,string) AreNotEqual<T>(T,T) AreNotEqual<T>(T,T,string) 断言连个T类型的对象,是否有相同的值
AreSame<T>(T,T) AreSame<T>(T,T,string)  AreNotSame<T>(T,T) AreNotSame<T>(T,T,string) 断言两个变量是否参照相同的对象
Fail() Fail(string) 不及格一个断言,没有条件被检查
Inconclusive() Inconclusive(string) 声明结果,当单元测试的结果不确定时
IsTrue(bool) IsTrue(bool,string) 断言为true,总是用于等价一个返回bool结果的表达式
IsFalse(bool) IsFalse(bool,string) 断言为false
IsNull(object) IsNotNull(object,string) 断言变量参照自object
IsInstanceOfType(object,Type) IsInstanceOfType(object,Type,string) IsNotInstanceOfType(object,Type) IsNotInstanceOfType(object,Type,string) 断言object是指定类型,或派生自指定类型

Assert类中的每个静态方法,允许我们检查单元测试中的一些方面。当断言不及格时,抛出出异常,这意味着单元测试整体不及格。每个单元测试都被分别对待,所以其他测试会继续执行。

每个方法都有一个带字符串参数的重载版本。字符串中包含断言不及格时,异常的message元素。AreEqual和AreNotEqual方法有一些重载来比较指定的类型。例如,这里有一个版本,它允许字符串被比较,不用考虑案例。

ExecptionExpected属性比较奇怪。只有在单元测试抛出ExceptionType参数指定类型的异常,断言成功。这是一个方便的方法,确保异常抛出,不需要用try…catch块瞎搞。

3 运行单元测试

将单元测试的项目设为启动项目,VS会在当前解决方案中为TestClass和TestMethod扫描所有的类。

【Pro ASP.NET MVC 3 Framework】.学习笔记.3.MVC的主要工具-单元测试的更多相关文章

  1. Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具

    每个MVC程序员的军火库中,都有这三个工具:一个依赖注入(DI)容器,一个单元测试框架,一个模拟工具. 1.准备一个示例项目 创建一个ASP.NET MVC Web Application的Empty ...

  2. Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具

    2.5.创建链式依赖 当你请求Ninject创建一个类型,它检查该类型的依赖是否声明.它也会检查该依赖是否依赖其他类型.如果这里有附加依赖,Ninject自动解决他们,并创建请求的所有类的实例.正是由 ...

  3. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  4. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  5. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  6. MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom

    <MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ...

  7. MVC缓存OutPutCache学习笔记 (一) 参数配置

    OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...

  8. Entity Framework 学习笔记(2)

    上期回顾:Entity Framework 学习笔记(1) Entity Framework最主要的东西,就是自己创建的.继承于DbContext的类: /// <summary> /// ...

  9. Entity Framework学习笔记

    原文地址:http://www.cnblogs.com/frankofgdc/p/3600090.html Entity Framework学习笔记——错误汇总   之前的小项目做完了,到了总结经验和 ...

  10. ADO.NET Entity Framework学习笔记(3)ObjectContext

    ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转]   说明 ObjectContext提供了管理数据的功能 Context操作数据 AddObject ...

随机推荐

  1. APICloud携技术入滇 助力互联网创业

    在<相比北上广二三线城市创业有哪些优势? >一文中,小编深入探讨了目前二三线城市在互联网行业发展的现状,城市间的消费错位导致了二三线城市具有大规模的消费能力,促使互联网行业的逐步崛起.我们 ...

  2. MySQL 事件跟踪器 , MySQL 无须重启服务 跟踪 SQL , 也无须配置日志

    第一步 创建以下两个 日志表 按 Ctrl+C 复制代码 按 Ctrl+C 复制代码 CREATE TABLE `general_log` ( `event_time` timestamp NOT N ...

  3. Flume-ng+Kafka+storm的学习笔记

    Flume-ng Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume的文档可以看http://flume.apache.org/FlumeUserGuide.html ...

  4. jQuery基础修炼圣典—DOM篇(一)

    一.DOM节点的创建 1.创建节点及节点属性 通过JavaScript可以很方便的获取DOM节点,从而进行一系列的DOM操作.但实际上一般开发者都习惯性的先定义好HTML结构,但这样就非常不灵活了. ...

  5. 电量显示Binding Converter MVVM

    用一个ProcessBar显示电量,低于20%时候,ForeGround为红色,否则为绿色, 页面使用了MVVM绑定到了ViewModel, ProcessBar XAML为 <Progress ...

  6. [转载]windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

    windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解 http://shashanzhao.com/archives/832.html 虽然是中文字,但是理解起来还是很困难,什么叫工 ...

  7. OGRFeature的DestroyFeature方法

    Ogr的销毁DestroyFeature方法: void OGRFeature::DestroyFeature( OGRFeature *poFeature ) { delete poFeature; ...

  8. Java基础之泛型——使用二叉树进行排序(TryBinaryTree)

    控制台程序. 1.实现针对容器类的基于集合的循环 为了让容器类类型的对象能够在基于集合的for循环中可用,类必须并且只需要满足一个要求——必须实现泛型接口java.lang.Iterable<& ...

  9. int和long long有符号整形 负数比正数多一个

    int的负数比正数多一个,则有一个负数在int范围内没有对应的正数 最大正整数用十六进制,很容易表示:0x7f ff ff ff int num = 0x7fffffff; num = -num; p ...

  10. NVL 和NVL2函数

    NVL 和NVL2函数 NVL函数: nvl(exp1,exp2) -->判断exp1是否是null,如果exp1不是则返回exp1的值,如果exp1为null则返回exp2 nvl2函数: n ...