使用Visual Studio进行单元测试-Part2
写在开头:Coding ain't done until all the tests run. No unit test no BB.
另外有童鞋在上一篇博文留言说找不到Add Fake Assembly的选项,估计是测试组建没有安装,上次漏说了,VS下面测试需要安装一个组建:
再搜索test
上一次写了一篇文章主要针对单元测试的基本介绍和VS测试框架的一个主要特性Stub。上次也说了Stub主要是针对接口进行模拟,非接口Stub是没有办法模拟的。
本文主要介绍VS测试框架下针对非接口编程的程序进行模拟--VS 测试框架的Shim。通过两个例子介绍:
- 通过Shim模拟外部Service
- 通过Shim模拟DateNow
通过Shim模拟外部Service
1. 先写一段用于测试的代码
一个用于发送Email的封装,该类直接调用Email组建发送Email
public class EmailService { public static bool SendEmail(string reveiver, string emailBody, string subject) { //call email remote service here to send email return true; } }
业务通知类,调用EmailService发送邮件,发送成功,返回1,失败返回0。
public class NotifierV2 { public int Notify() { var result = EmailService.SendEmail("ut@cnblogs.com", "email body", "emailSubject"); if (result) { ; } else { ; } } }
2. 生成测试代码(略,方法见前一篇博文)
3. 上面的Notify至少应该对应两个Case:
- 当Email Service返回true
- 当Emial Service返回false
和上一篇文章所说一样,我们的测试代码想随心所欲的指定EmailService的返回结果,但是这次EmailService不是针对接口进行编程的,这种需要使用MS的Shim技术,Shim同样是通过Add Fake Assembly方法实现的
4. 测试代码:
4. 上面有几点需要注意(也是Shim的关键点)
- Shims.Context.Create(). 这个是Shim机制的上下文,只有在这个Context下面Shim机制才会起作用
- ShimEmailService是对EmailService这个类的Fake。被Fake的程序集里面的所有Public的类都有对应的ShimXXX
- 上面的UT运行的时候,当被测试的Notify调用到EmailService.SendEmail方法时,单元测试不会执行真正的SendEmail方法,而是会执行我们通过Shim指定的方法,从而完成了对Service的动态替换
再举一个模拟时间的例子
示例代码,判断今天是不是情人节(2-14)
public class DateTimeDemo { public static bool IsValentinesDay() { var now = DateTime.Now; && now.Day == ) { return true; } return false; } }
常规情况下,这段代码是没有办法测试的,除非修改服务器时间。
这个时候我们要模拟当前时间,我们需要对DateTime对应的程序集System进行Fake
测试代码
ShimDate.Time在System.Fake程序集。上面代码通过ShimDateTime.NowGet对Sysytem.Now进行了模拟赋值。
使用Visual Studio进行单元测试-Part2的更多相关文章
- 【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)
作者:[美]Adam Freeman 来源:<精通ASP.NET MVC 4> 3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本 ...
- [转]Visual Studio 2010 单元测试目录
Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...
- 使用Visual Studio进行单元测试
一.使用Visual Studio进行单元测试的几个建议 1.先写单元测试(依我愚见,应该是接口先行,如果有的话) -> 测试失败 -> 以最小的改动(即编写实际代码)使测试通过(而在VS ...
- Visual Studio 2010 单元测试目录
单元测试的重要性这里我就不多说了,以前大家一直使用NUnit来进行单元测试,其实早在Visual Studio 2005里面,微软就已经集成了一个叫Test的专门测试插件,经过几年的发展,这个工具现在 ...
- Visual Studio 2010 单元测试之一---普通单元测试
原文:Visual Studio 2010 单元测试之一---普通单元测试 本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元 ...
- Visual Studio 2010 单元测试--运行测试并查看代码覆盖率
原文:Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试 ...
- MVC 基本工具(Visual Studio 的单元测试、使用Moq)
3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本文打算使用 Visual Studio 附带的内建单元测试支持,但其他一些.NET单元测试包也是可用的. ...
- [转]Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率
Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试并查看 ...
- C# Note31: 如何使用Visual Studio做单元测试
待更! 使用Visual Studio 2013进行单元测试--初级篇 带你玩转Visual Studio——单元测试(C++例)
随机推荐
- Python闲谈(二)聊聊最小二乘法以及leastsq函数
1 最小二乘法概述 自从开始做毕设以来,发现自己无时无刻不在接触最小二乘法.从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法. 1-1 “多线→一 ...
- 1.Python学习---helloworld
1.首先访问http://www.python.org/download/去下载最新的python版本. 2.安装下载包,一路next. 3.为计算机添加安装目录搭到环境变量,如图把python的安装 ...
- hdu 3718 Different Division
Different Division Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- IDEA报错: Invalid bound statement (not found): com.test.mapper.UserMapper.selectByPrimaryKey(转发:https://www.cnblogs.com/woshimrf/p/5138726.html)
学习mybatis的过程中,测试mapper自动代理的时候一直出错,在eclipse中可以正常运行,而同样的代码在idea中却无法成功.虽然可以继续调试,但心里总是纠结原因.百度了好久,终于找到一个合 ...
- Kindeditor 函数用途
1.loadScript 加载文件 2.updateState 更新工具条状态 afterCreate在dom加载的时候执行,dom加载完之前执行的 K.ready dom加载完之后执行 ...
- where find
where查询不到返回ActiveRecord::Relation [] find返回异常ActiveRecord::RecordNotFound: Couldn't find where 查到返回 ...
- socket编程详解
http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html http://blog.csdn.net/hguisu/article/de ...
- .vimrc .bashrc
怕丢了,赶快保存! .bashrc # switch caps lock with escxmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'sudo ...
- 使用MAVEN手动创建web项目
问题:如下图,使用maven创建webapp项目时,默认使用maven-archetype-webapp这个archetype,由于这个archetype比较古老,有如下缺点: 1. 默认生成的项目会 ...
- java -ea
两题考的都是 assert和assertionassert是JDK1.4(&+)中新增的关键字,其功能称作assertionassert 条件表达式 如果条件表达式不成立 ...