一:什么是单元测试

单元测试是对软件进行准确性验证的步骤。单元测试并不进行整个软件功能的测试,仅仅是对于最小工作单元的测试。一般最小工作单元就是指方法/函数等。

这里并不打算对单元测试的概念及基础进行更多的介绍,需要了解更多的自行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)的更多相关文章

  1. 使用Microsoft Fakes进行单元测试(2)

    接上一篇使用Microsoft Fakes进行单元测试(1) 下面进行Shim的演示. 2.使用Shim替换静态方法 假设我们需要一个工具方法用来格式化当前时间为字符串,因为DateTime.Now一 ...

  2. Microsoft Fakes进行单元测试

    使用Microsoft Fakes进行单元测试(1)   一:什么是单元测试 单元测试是对软件进行准确性验证的步骤.单元测试并不进行整个软件功能的测试,仅仅是对于最小工作单元的测试.一般最小工作单元就 ...

  3. 使用 Microsoft Fakes 进行单元测试

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 在编写单元测试时,我们会遇到不同的外部依赖项,大体上可以分为两类: 依赖于接口或抽象类 依赖于具体类 ...

  4. VS2012 Unit Test——Microsoft Fakes入门

    如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...

  5. 使用Microsoft Fakes隔离测试代码

    在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...

  6. Microsoft Fakes

    http://baike.baidu.com/view/9602275.htm?fr=aladdin http://technet.microsoft.com/zh-cn/magazine/hh549 ...

  7. C#单元测试面面观

    标题有点标题党,但相信各位看完这篇文章一定会所收获,如果之前没有接触过单元测试或了解不深通过本文都能对单元测试有个全新认识.本文的特点是不脱离实际,所测试的代码都是常见的模式. 写完这篇文章后,我看了 ...

  8. 使用IdleTest进行TDD单元测试驱动开发演练(1)

    [前言] 开发工具:Visual Studio 2012 测试库:Visual Studio 2012自带的MSTest DI框架:Unity 数据持久层:Entity Framework 前端UI: ...

  9. 解决问题:无法对 System程序集 添加Fakes程序集

    为了在单元测试中指定DateTime.Now的值,我采用Microsoft Fakes技术的Shim. 主要参考了园里的http://www.cnblogs.com/FreeDong/p/335311 ...

随机推荐

  1. C语言结构体-struct

    知识点: 1)结构体的定义. 2)结构体的sizeof. 3)  结构体的指针. 1) 结构体的定义: 在逻辑上有一定关联的多个数据类型做为一整体进行操作的数据结构,它的关键字是struct.下面我将 ...

  2. Wireshark插件编写

    Wireshark插件编写 在抓包的过程中学习了使用wireshark,同时发现wireshark可以进行加载插件,便在网上学习了一下相应的插件开发技术. 需求编写一个私有协议名为SYC,使用UDP端 ...

  3. git抽疯了。。。

    今天用git推送提交的时候,莫名其妙的要求输入密码,输就输吧,输入了还都验证不了,继续弹出输入框,难道我的密码记错了,于是我去更改了密码,但还是继续弹出密码输入框. 百思不得姐,于是把重新生成了pub ...

  4. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

  5. java中的Static class

    Java中的类可以是static吗?答案是可以.在java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class) ...

  6. AlwaysON同步的原理及可用模式

    新一代读写分离技术——AlwaysOn 早在SQL Server 2005的时候微软就已经实现了数据库的查询分离技术——发布订阅.但生产库和查询库的同步性能较差,时常出现性能问题,因此在大型生产环境中 ...

  7. Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架

    C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们 ...

  8. [Unity3D]再次点击以退出程序

    [Unity3D]再次点击以退出程序 本文介绍为Android应用编写点击返回按键时的"再次点击以退出程序"的方法. +BIT祝威+悄悄在此留下版了个权的信息说: 下面是一个测试用 ...

  9. Lucene系列-概述

    为了生存,就得干一行爱一行.那就学习下lucene吧. 全文检索介绍 流程: 建索引 准备待搜索文档 文档分词:将文档分成一个个单独的单词,去除标点符号.停词(无意义的冠词介词等),得到token 语 ...

  10. Java中MVC详解以及优缺点总结

     概念:  MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务数据.逻辑.界面显示分离的 ...