VS2012 Unit Test——Microsoft Fakes入门
如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本。
关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/library/hh549175.aspx
关于VS2012单元测试的前期文章:
1.《在Visual Studio 2012使用单元测试》、
2.《VS2012 单元测试之泛型类(Generics Unit Test)》、
3.《VS2012 Unit Test —— 我对接口进行单元测试使用的技巧》
4.《VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试》
依我个人理解单元测试就是对程序的小单元进行测试,一个测试不应包含两个或更多单元,总体而言大多都是对方法、属性的编码正确性进行验证。但是往往一个方法又会调用其他的方法或属性,我这里暂称之为外部依赖,因而外部依赖会影响程序单元的测试结果,要避免这样的情况就不得不使用一些外部依赖的模拟进行隔离(Isolate),本文就是使用了Microsoft Fakes,当然还有其他更为流行的框架可以选择使用(Moq、Rhino Mocks、Type Mock)
Fakes有两种形式:stub 和 shim。具体的介绍我就不啰嗦,因为我英文不好可能会表达错误误导新人。
我的Demo也是看了MSDN后以个人理解后进行简单的编写,如果MSDN看懂了也就不用看以下内容了,期待和我一样正在使用VS2012 MSTest进行单元测试的一起交流进步。
一、shim
以下将模拟DateTime的Now属性,假设我现在需要在活动服务类ActivityService添加一个方法验证某个线下活动是否过期。
1. 打开VS2012,创建单元测试项目FakesTesting,我这是测试先行。重命名项目自动生成的类UnitTest1为ActivityServiceTest,将TestMethod1改为IsExpireTest(是否过期).
2. 添加代码“ActivityService service = new ActivityService();”并使用VS快捷功能为我们创建ActivityService 类

3. 添加Fakes,由于DateTime位于System程序集,因而将添加System的Fake程序集(右键System程序集), 然后在测试类“using System.Fakes;”

4. 编写测试代码如下
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Fakes;
using Microsoft.QualityTools.Testing.Fakes; namespace FakesTesting.Test
{
[TestClass]
public class ActivityServiceTest
{
[TestMethod]
public void IsExpireTest()
{
ActivityService service = new ActivityService();
bool actual = service.IsExpire();
Assert.IsFalse(actual); using (ShimsContext.Create())
{
ShimDateTime.NowGet = () => new DateTime(, , );
actual = service.IsExpire();
Assert.IsFalse(actual);
}
}
}
}
5. 然后编写ActivityService类
public class ActivityService
{
public DateTime BeginTime { get; set; } public ActivityService()
{
this.BeginTime = new DateTime(, , ); //仅作演示,无意义
} public bool IsExpire()
{
return BeginTime >= DateTime.Now;
}
}
6. 运行测试通过。然后就可以把实际业务类移动到相应VS项目中,并调整命名空间。
二、Stub
现在假设ActivityService类有一个方法获取是否还能报名,但是它依赖于仓储IActivityRepository(只有遵循依赖反转与接口隔离原则的代码才好使用Stub填充外部依赖)提供的RegisterNumber方法。
1. IActivityRepository接口(新建IRepositories项目并添加该接口)
public interface IActivityRepository
{
/// <summary>
/// 已报名人数
/// </summary>
int RegisterNumber();
}
2. 而我们的单元测试现在不能依赖具体(实际环境中的Repository可能对测试带来影响),这时候就能使用Stub来填充该接口了,添加IRepositories引用,然后与上一个Demo一样的添加IRepositories的Fakes程序集。
3. 在测试类中添加Using代码
using IRepositories;
using IRepositories.Fakes;
4. 编写测试代码
[TestMethod]
public void CanRegisterTest()
{
StubIActivityRepository repository = new StubIActivityRepository();
ActivityService service = new ActivityService(repository); //如果已报名人数小于最多可报名数量则不能再报名,断言CanRegister方法应为True
repository.RegisterNumber = ()=> ;
bool actual = service.CanRegister();
Assert.IsTrue(actual); //如果已报名人数大于等于最多可报名数量则不能再报名,断言CanRegister方法应为False
repository.RegisterNumber = () => ;
actual = service.CanRegister();
Assert.IsFalse(actual);
}
5. ActivityService代码:
public class ActivityService
{
public DateTime BeginTime { get; set; } /// <summary>
/// 最多可报名数量
/// </summary>
private int maxCount = ;
private IActivityRepository repository; public ActivityService()
{
this.BeginTime = new DateTime(, , ); //仅作演示,无意义
} public ActivityService(IActivityRepository repository)
{
// TODO: Complete member initialization
this.repository = repository;
} public bool IsExpire()
{
return BeginTime >= DateTime.Now;
} public bool CanRegister()
{
return repository.RegisterNumber() < this.maxCount;
}
}
总结
stub用于我们可控的代码,shim用于不可控的,例如.NET Framework以及第三方类库等。
VS2012 Unit Test——Microsoft Fakes入门的更多相关文章
- VS2012 Unit Test 个人学习汇总(含目录)
首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...
- VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
[1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...
- VS2012 Unit Test
VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...
- 使用Microsoft Fakes隔离测试代码
在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...
- 使用 Microsoft Fakes 进行单元测试
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 在编写单元测试时,我们会遇到不同的外部依赖项,大体上可以分为两类: 依赖于接口或抽象类 依赖于具体类 ...
- VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
[提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...
- 使用Microsoft Fakes进行单元测试(2)
接上一篇使用Microsoft Fakes进行单元测试(1) 下面进行Shim的演示. 2.使用Shim替换静态方法 假设我们需要一个工具方法用来格式化当前时间为字符串,因为DateTime.Now一 ...
- 使用Microsoft Fakes进行单元测试(1)
一:什么是单元测试 单元测试是对软件进行准确性验证的步骤.单元测试并不进行整个软件功能的测试,仅仅是对于最小工作单元的测试.一般最小工作单元就是指方法/函数等. 这里并不打算对单元测试的概念及基础进行 ...
- Microsoft Fakes
http://baike.baidu.com/view/9602275.htm?fr=aladdin http://technet.microsoft.com/zh-cn/magazine/hh549 ...
随机推荐
- Salesforce开发者学习笔记之一:基本知识
本文介绍了Salesforce开发平台的基本知识, 包括如下内容: Salesforce平台介绍 Salesforce基本术语 定制和扩展Salesforce平台 创建一个简单的应用程序 Salesf ...
- C#(或者说.NET/Mono)能做的那些事
不做语言之争,只陈述事实: 1.桌面软件与服务 不仅是在Windows上,有了开源的Mono,在Apple Mac和Linux(如:Ubuntu)上也有C#的施展天地.并且还可以通过mkbundle工 ...
- Node.js实现RESTful api,express or koa?
文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...
- 使用Rest访问Redis中的数据
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 大家在用Redis保存数据的时候,有不同的序列化方式.用得最多应该还是JSON,有一些场景我们需要以Http请 ...
- JavaScript dom 标签属性
节点: 平时开发中常用的节点是: 元素节点:nodeType值是 1 --> <a>,<p>...... 属性节点:nodeType值是 2 --> t ...
- JavaScript随笔3
1.获取非行间css if(oDiv.currentStyle){ alert(oDiv.currentStyle.width); }else{ alert(oDiv.getComputedStyle ...
- HTML5_05之SVG扩展、地理定位、拖放
1.SVG绘图总结: ①方法一:已有svg文件,<img src="x.svg"> 方法二:<body><svg></svg>&l ...
- C++多态详解
多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...
- Bootstrap3插件系列:bootstrap-select2
1.下载插件 https://github.com/select2/select2 http://select2.github.io/ 2.引用插件 <script src="~/Sc ...
- 基本数据结构(2)——算法导论(12)
1. 引言 这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍 我们在上一篇中提过,栈与队 ...