使用Microsoft Fakes进行单元测试(1)
一:什么是单元测试
单元测试是对软件进行准确性验证的步骤。单元测试并不进行整个软件功能的测试,仅仅是对于最小工作单元的测试。一般最小工作单元就是指方法/函数等。
这里并不打算对单元测试的概念及基础进行更多的介绍,需要了解更多的自行google。
二:UnitTestFramework
UnitTestFramework是微软开发的一套单元测试框架。类似的三方框架有NUnit等。UnitTestFramework为单元测试提供断言,自动化测试,管理界面等功能。与VisualStudio无缝集成。
三:Microsoft Fakes
Microsoft Fakes是UnitTestFramework下的高级组件。Microsoft Fakes可以帮我们隔离测试的代码。我们的代码/方法很多时候并不是完全独立的。一个方法会受到传入的参数的影响,一个方法也可能去调用另外一个方法才能正确的执行。所以当我们想要对一个方法进行单元测试的时候,如果有其他因素影响,那么我们很难确定这个方法失败错误的真实原因。所以我们进行单元测试的时候就要想办法消除这些影响。这个时候我们可以用Microsoft Fakes。Microsoft Fakes可以用来模拟接口,静态方法等,通过Microsoft Fakes模拟的方法,具有稳定的,可以预期的返回值,这个时候我们就可以认为消除了外部模块对单元测试的影响。
注意:Microsoft Fakes并不是所有版本的VisualStudio都支持,通常只有高级版本才包含。比如VisualStudio2015只有Enterprice版本才支持。
Microsoft Fakes主要有2大功能:
stub:
一个stub可以用来替换一个实现了某个接口的class。简单的说stub可以用来快速的实现一个接口,用来测试。使用stub来测试,你的程序必须是面向接口设计的。
shim:
一个shim可以用来替换一个你已经编译完成的库中的某个方法,当你的测试运行的时候,调用的是shim模拟的方法。shim可以用来模拟那些你无法修改的程序集的方法,比如.NET内置类库。
四:示例
1.使用Stub来模拟接口
使用VisualStudio新建一个项目叫做MSFakeSample:
我们想象这样一个业务需求。我们需要把所有学生的名称组合成一个用逗号分隔的字符串。所有的学生信息存放在数据库里。
IStudentsRepository
这个接口描述的是Students仓储类需要实现的功能。
StudentsService
这类是用来实现Students的业务逻辑。
按照正常的开发逻辑,我们这个时候还需要去实现IStudentsRepository这个接口,也许是封装EF,也许是封装Dapper等等,然后才能去测试ConnectNames这个方法。但是尽管用EF等去实现了IStudentsRepository接口,我们的测试方法严重依赖了仓储层,数据库。也许为了测试我们还需要配置数据库连接,添加模拟数据到数据库。任何IStudentsRepository实现类的变化,或者数据库的变化,都可能影响到单元测试的结果。如果我们可以隔离这些变化那么我们的单元测试将变得非常完美。
有了Microsoft Fakes我们可以模拟一个实现了IStudentsRepository的类,来完全的隔离IStudentsRepository实现类的变化,或者数据库的变化。
创建单元测试类
在ConnectNames方法上右击,点击创建单元测试
在弹出的创建单元测试对话框上点击确定,程序就会自动创建一个以当前项目名称+Tests的项目,并且为你生成一个测试类StudentsServiceTests。
添加Fakes程序集
新增的Tests项目会自动引用MSFakeSample项目,在引用下右击MSFakeSample,点击添加Fakes程序集
点击添加Fakes程序集后VS会自动生成一个MSFakeSample.fakes的库并且引用。
使用stub来模拟接口
有了上面的这些操作,我们就可以开始真正的使用Fakes的Stub来模拟接口了。
我们直接new了3个StubIStudentsRepository类,并且用Lambda表达式直接定义了3个方法,分别返回null,空List,跟一个正常的List来描述3种情况。然后用Assert去断言跟预期的结果是否一致。
运行单元测试
Ctrl+T+R直接运行,会弹出单元测试运行窗口
可以看到ConnectNamesTest Passed,测试通过了。
通过使用Fakes的Stub功能,我们可以轻而易举的模拟接口。利用Lambda表达式来直接控制方法的返回值,使其稳定不变,从而为测试方法隔离接口。
不管你真正的接口如何实现,我测试的方法永远不会受到影响。
2.使用Shim模拟静态方法
太晚了,下回分解吧。晚安~
使用Microsoft Fakes进行单元测试(1)的更多相关文章
- 使用Microsoft Fakes进行单元测试(2)
接上一篇使用Microsoft Fakes进行单元测试(1) 下面进行Shim的演示. 2.使用Shim替换静态方法 假设我们需要一个工具方法用来格式化当前时间为字符串,因为DateTime.Now一 ...
- Microsoft Fakes进行单元测试
使用Microsoft Fakes进行单元测试(1) 一:什么是单元测试 单元测试是对软件进行准确性验证的步骤.单元测试并不进行整个软件功能的测试,仅仅是对于最小工作单元的测试.一般最小工作单元就 ...
- 使用 Microsoft Fakes 进行单元测试
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 在编写单元测试时,我们会遇到不同的外部依赖项,大体上可以分为两类: 依赖于接口或抽象类 依赖于具体类 ...
- VS2012 Unit Test——Microsoft Fakes入门
如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...
- 使用Microsoft Fakes隔离测试代码
在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...
- Microsoft Fakes
http://baike.baidu.com/view/9602275.htm?fr=aladdin http://technet.microsoft.com/zh-cn/magazine/hh549 ...
- C#单元测试面面观
标题有点标题党,但相信各位看完这篇文章一定会所收获,如果之前没有接触过单元测试或了解不深通过本文都能对单元测试有个全新认识.本文的特点是不脱离实际,所测试的代码都是常见的模式. 写完这篇文章后,我看了 ...
- 使用IdleTest进行TDD单元测试驱动开发演练(1)
[前言] 开发工具:Visual Studio 2012 测试库:Visual Studio 2012自带的MSTest DI框架:Unity 数据持久层:Entity Framework 前端UI: ...
- 解决问题:无法对 System程序集 添加Fakes程序集
为了在单元测试中指定DateTime.Now的值,我采用Microsoft Fakes技术的Shim. 主要参考了园里的http://www.cnblogs.com/FreeDong/p/335311 ...
随机推荐
- 【C语言学习】《C Primer Plus》第10章 数组和指针
学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...
- 上层建筑——DOM元素的特性与属性(dojo/dom-prop)
上一篇讲解dojo/dom-attr的文章中我们知道在某些情况下,attr模块中会交给prop模块来处理.比如: textContent.innerHTML.className.htmlFor.val ...
- 客户端GUI程序开发漫谈
这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水 去年夏天的时候,我用QT做了一个小工具 后来还用QT做了流程设计器 我把程序分享给飞扬青云之后,他甚至搞出来一套QT的皮肤来 说 ...
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- NSDate NSString相互转化
时间戳是经常用到的,今天就总结一下 //设置转化格式 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter s ...
- javascript里阻止事件冒泡
如下图所示,灰色块包含红色块,假设我们为灰色和红色块各绑定一个单击弹框事件,当我们点击红色块时,不希望触发灰色块的弹框事件,这就需要阻止冒泡事件了. IE里阻止冒泡事件使用cancelBubble属性 ...
- [javaweb]Java过滤器与包装设计模式的实用案例.
在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...
- 修复发生“由于数据移动,未能继续以 NOLOCK 方式扫描”错误的数据库
最近在系统运行中发现了一个错误,错误信息如下: 错误信息:查询A201412C20568单证信息错误 ---> System.Data.OleDb.OleDbException: 由于数据移动, ...
- 使用SQLAlchemy
使用SQLAlchemy 参考: http://www.sqlalchemy.org/ https://www.keakon.net/2012/12/03/SQLAlchemy%E4%BD%BF%E7 ...
- 11.按要求编写Java应用程序。 (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另 一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。
package java1; public class Che { //属性 public String nub; public int speed; public double weight ; C ...