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 ...
随机推荐
- JBPM
JBPM简介 什么是jbpm JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩 ...
- 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- ASP.NET MVC Model元数据(四)
ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...
- egret调用页面js的方法。
参考文献: http://bbs.egret-labs.org/thread-267-3-1.html http://docs.egret-labs.org/post/manual/threelibs ...
- ABP源码分析十二:本地化
本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...
- Android RecyclerView 实现支付宝首页效果
Android RecyclerView 实现支付宝首页效果 [TOC] 虽然我本人不喜欢支付宝的,但是这个网格本身其实还是不错的,项目更新中更改了一个布局为网格模式,类似支付宝.(估计是产品抄袭的= ...
- backup4:数据库自动备份,自动删除备份文件
一:手写TSQL 脚本 1,自动备份 每周进行一次Database 的 Full Backup,设置 Schedule Interval 为Weekly use master go ) )+N'.ba ...
- 大数据时代下的SQL Server第三方负载均衡方案----Moebius测试
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...
- VS2010中dll不可用问题
最近做项目的时候,深圳那边提供了一个算法.算法在那边跑的好的很,但是在我这边怎么跑都跑不起来,总是报错:说找不到dll. 1.第一种想法:找不到dll,是不是dll放的位置不对.找了一下目录,导入的路 ...
- 挑子学习笔记:对数似然距离(Log-Likelihood Distance)
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/log-likelihood_distance.html 本文是“挑子”在学习对数似然距离过程中的笔记摘录,文 ...