写在开头: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。通过两个例子介绍:

  1. 通过Shim模拟外部Service
  2. 通过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:

  1. 当Email Service返回true
  2. 当Emial Service返回false

和上一篇文章所说一样,我们的测试代码想随心所欲的指定EmailService的返回结果,但是这次EmailService不是针对接口进行编程的,这种需要使用MS的Shim技术,Shim同样是通过Add Fake Assembly方法实现的

4. 测试代码:

4. 上面有几点需要注意(也是Shim的关键点)

  1. Shims.Context.Create(). 这个是Shim机制的上下文,只有在这个Context下面Shim机制才会起作用
  2. ShimEmailService是对EmailService这个类的Fake。被Fake的程序集里面的所有Public的类都有对应的ShimXXX
  3. 上面的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的更多相关文章

  1. 【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)

     作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> 3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本 ...

  2. [转]Visual Studio 2010 单元测试目录

    Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...

  3. 使用Visual Studio进行单元测试

    一.使用Visual Studio进行单元测试的几个建议 1.先写单元测试(依我愚见,应该是接口先行,如果有的话) -> 测试失败 -> 以最小的改动(即编写实际代码)使测试通过(而在VS ...

  4. Visual Studio 2010 单元测试目录

    单元测试的重要性这里我就不多说了,以前大家一直使用NUnit来进行单元测试,其实早在Visual Studio 2005里面,微软就已经集成了一个叫Test的专门测试插件,经过几年的发展,这个工具现在 ...

  5. Visual Studio 2010 单元测试之一---普通单元测试

    原文:Visual Studio 2010 单元测试之一---普通单元测试 本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元 ...

  6. Visual Studio 2010 单元测试--运行测试并查看代码覆盖率

    原文:Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试 ...

  7. MVC 基本工具(Visual Studio 的单元测试、使用Moq)

    3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本文打算使用 Visual Studio 附带的内建单元测试支持,但其他一些.NET单元测试包也是可用的. ...

  8. [转]Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率

    Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试并查看 ...

  9. C# Note31: 如何使用Visual Studio做单元测试

    待更! 使用Visual Studio 2013进行单元测试--初级篇 带你玩转Visual Studio——单元测试(C++例)

随机推荐

  1. Python闲谈(二)聊聊最小二乘法以及leastsq函数

    1 最小二乘法概述 自从开始做毕设以来,发现自己无时无刻不在接触最小二乘法.从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法. 1-1 “多线→一 ...

  2. 1.Python学习---helloworld

    1.首先访问http://www.python.org/download/去下载最新的python版本. 2.安装下载包,一路next. 3.为计算机添加安装目录搭到环境变量,如图把python的安装 ...

  3. hdu 3718 Different Division

    Different Division Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. IDEA报错: Invalid bound statement (not found): com.test.mapper.UserMapper.selectByPrimaryKey(转发:https://www.cnblogs.com/woshimrf/p/5138726.html)

    学习mybatis的过程中,测试mapper自动代理的时候一直出错,在eclipse中可以正常运行,而同样的代码在idea中却无法成功.虽然可以继续调试,但心里总是纠结原因.百度了好久,终于找到一个合 ...

  5. Kindeditor 函数用途

    1.loadScript  加载文件   2.updateState 更新工具条状态   afterCreate在dom加载的时候执行,dom加载完之前执行的 K.ready dom加载完之后执行   ...

  6. where find

    where查询不到返回ActiveRecord::Relation [] find返回异常ActiveRecord::RecordNotFound: Couldn't find  where 查到返回 ...

  7. socket编程详解

    http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html http://blog.csdn.net/hguisu/article/de ...

  8. .vimrc .bashrc

    怕丢了,赶快保存! .bashrc # switch caps lock with escxmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'sudo ...

  9. 使用MAVEN手动创建web项目

    问题:如下图,使用maven创建webapp项目时,默认使用maven-archetype-webapp这个archetype,由于这个archetype比较古老,有如下缺点: 1. 默认生成的项目会 ...

  10. java -ea

    两题考的都是 assert和assertionassert是JDK1.4(&+)中新增的关键字,其功能称作assertionassert 条件表达式            如果条件表达式不成立 ...