写在开头: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的进程和线程

    关于进程: An executing instance of a program is called a process.程序的执行实例称为进程. Each process provides the ...

  2. linux c编程:信号(一)

    信号是软件中断,很多比较重要的应用程序都需要处理信号.并且信号提供了一种处理异步事件的方法.如终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序 很多条件都可以产生信号,比如 ...

  3. centos7 使用postgres

    1: http://www.cnblogs.com/think8848/p/5877076.html 2:http://blog.csdn.net/xuaa/article/details/52262 ...

  4. onActivityResult方法不执行,什么原因?

    原因: public void OnOpenPlayersActivity(View view) {  Intent intent = new Intent();  intent.setClass(g ...

  5. PAT 天梯赛 L2-017. 人以群分 【排序】

    题目链接 https://www.patest.cn/contests/gplt/L2-017 思路 第一个条件是 人群的规模尽可能接近 那么 N 为偶数的时候 就是 一半 一半 N 为奇数的时候 就 ...

  6. iOS 基本数据类型 和 指针 特点

    基本数据类型 : 整型int, 字符型char , 浮点型 (float 和 double), 枚举型; -- 构造类型 : 数组类型, 结构体类型, 共用体类型; -- 指针类型 : 最终要的数据类 ...

  7. 基于Web的实验室管理系统技术简要报告

    基于Web的实验室管理系统技术简要报告 Copyright 朱向洋 Sunsea ALL Right Reserved 一.网站架构 该网站使用C#语言,利用SQL Server2008数据库,采用V ...

  8. Linux平台下贪吃蛇游戏的运行

    1.参考资料说明: 这是一个在Linux系统下实现的简单的贪吃蛇游戏,同学找帮忙,我就直接在Red Hat中调试了一下,参考的是百度文库中"maosuhan"仁兄的文章,结合自己的 ...

  9. running a background task over ssh

    原文: Why does running a background task over ssh fail if a pseudo-tty is allocated? 问题: I've recently ...

  10. Qt版权介绍:GPL, LGPL 以及 Commercial 授权

    http://blog.csdn.net/changsheng230/article/details/6167933 Qt版权介绍:GPL, LGPL 以及 Commercial 授权 分类: Qt ...