写在开头: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. Java防止XSS攻击

    方法一:转义存储:添加XssFilter 1.在web.xml添加过滤器: <!-- 解决xss漏洞 --> <filter> <filter-name>xssFi ...

  2. 【HTML5开发系列】meta元素详解

    meta元素可以用来定义文档的各种元数据.他有很多种用法,一个HTML文档可以包含多个meta元素. meta元素在HTML5中的变化 charset属性是HTML5中新增的.在HTML4中,http ...

  3. IIS架构介绍

    IIS7及以上版本提供的请求-处理架构包括以下内容: Windows Process Activation Service(WAS)可以让站点支持更多协议,不仅仅是HTTP和HTTPS 可以通过增加或 ...

  4. linux shell脚本: 自动监控网站状态并发送提醒邮件

    1.创建监控脚本:$ vi /alidata/shell/webcheck.sh #!/bin/sh weblist="/alidata/shell/weblist.txt" my ...

  5. 【python】-- 进程与线程

    进程与线程 一.概念 1.简述: 计算机,所有的指令的操作都是有CPU来负责的,cpu是来负责运算的.OS(操作系统) 调度cpu的最小单位就是线程.程序启动后,从内存中分一块空间,把数据临时存在内存 ...

  6. python 的for else语句

    for中间不是break出来的,是正常循环完跳出循环的会执行else内的语句 while else语句也是如此 这个以前的常见语言没有,特此记录

  7. Docker的前世今生

    核心知识点: 1.Docker的构想:对应用的封装.分发.部署.运行的生命周期的管理,一次封装到处运行 2.Docker的优点:一站式解决方案 3.Docker由LXC演变而来,迟迟没有集成到Linu ...

  8. python利用wxpy监控微信公众号

    此次利用wxpy可以进行微信公众号的消息推送监测(代码超级简单),这样能进行实时获取链接.但是不光会抓到公众号的消息,好友的消息也会抓到(以后会完善的,毕竟现在能用了,而且做项目的微信号肯定是没有好友 ...

  9. MySQL常用代码

    create database 数据库名 create table CeShi1( Uid varchar(50) primary key, Pwd varchar(50), Name varchar ...

  10. CSS选择器(二)

    五.属性选择器. 属性选择器可以根据元素的属性及属性值来选择元素. 简单属性选择 如果希望选择有某个属性的元素,而不论属性值是什么,可以使用简单属性选择器. 例子 1 如果您希望把包含标题(title ...