写在开头: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. jqcloud 标签云效果

    官网地址: http://mistic100.github.io/jQCloud/index.htmlgithub 地址: https://github.com/lucaong/jQCloud使用 & ...

  2. Spring标签@Aspect-实现面向方向编程(@Aspect的多数据源自动加载)——SKY

    从Spring 2.0开始,可以使用基于schema及@AspectJ的方式来实现AOP.由于@Aspect是基于注解的,因此要求支持注解的5.0版本以上的JDK. 环境要求:    1. mybit ...

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

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

  4. cocos2dx使用cocostudio导出的ui

    local uilocal function createLayerUI() if not ui then ui=cc.Layer:create(); createLayerUI=nil; end r ...

  5. 我的Android进阶之旅------>WindowManager.LayoutParams介绍

    本文转载于: http://hubingforever.blog.163.com/blog/static/171040579201175111031938/ 本文参照自: http://develop ...

  6. BAPI_SALESORDER_CREATEFROMDAT2 创建退货SO

    BAPI_SALESORDER_CREATEFROMDAT2创建退货订单时,会出现以下错误:不允许业务对象 BUS2032 和销售凭证类别 H 的组合. 解决办法: 采用/原BAPI的内嵌BAPI: ...

  7. 目标检测--之RCNN

    目标检测--之RCNN 前言,最近接触到的一个项目要用到目标检测,还有我的科研方向caption,都用到这个,最近电脑在windows下下载数据集,估计要一两天,也不能切换到ubuntu下撸代码~.所 ...

  8. POJ - 2195 Going Home 【KM】

    题目链接 http://poj.org/problem?id=2195 题意 在一张N * M 的地图上 有 K 个人 和 K 个房子 地图上每个点都是认为可行走的 求 将每个人都分配到不同的房子 求 ...

  9. Data Structure Binary Tree: Connect nodes at same level using constant extra space

    http://www.geeksforgeeks.org/connect-nodes-at-same-level-with-o1-extra-space/ recursive: #include &l ...

  10. [原创]java WEB学习笔记33:Session 案例 之 购物车

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...