使用Moles对静态方法做UnitTest

        我们在开发,有时遇到一些Legcy代码,然后需要对它们进行UnitTest。UnitTest的重要性在这里不再说了。但是发现某些Class中有些方法是Static的,按以往的方法我们需要用
Extact Interface 方法 从那个需要测试的Class,然后使用 IOC /DI 的方式替换具体的实现,用一个Fake Class或Mock 一个实现来完成 UnitTest。现在我们可以使用Moles 对静态方法做UnitTest。看下面的示例:

        假设有这个样的Class:

   1:      public class SomeClass
   2:      {
   3:          private int AddTenItem(int num)
   4:          {
   5:              return num + 10;
   6:          }
   7:   
   8:          private static int AddTwentyItem(int num)
   9:          {
  10:              return num + 20;
  11:          }
  12:   
  13:          public static string GetMessage(string msg)
  14:          {
  15:              return string.Format("--{0}--", msg);
  16:          }
  17:   
  18:          public string GetTotalItem(int num)
  19:          {
  20:              return string.Format("{0}", AddTenItem(num) + AddTwentyItem(num)) ;
  21:          }
  22:      }

         从上面方法我们看到一个GetMessage静态方法,下面看用UnitTest如何测试它。你需要先下载安装Moles从官方网站,然后在VS2010中通过Project的 Reference右键菜单 在需要Mock Assembly,选择”Add Moles Assembly” ,它会自动生成一个 “SomeNameAssembly.Moles”程序集。编写下面的单元测试Code:

   1:          [TestMethod]
   2:          [HostType("Moles")]
   3:          public void TestGetMessageWithMoles()
   4:          {
   5:              //arrange
   6:              MSomeClass.GetMessageString = (str) => str + "--";
   7:   
   8:              //act
   9:              var result = SomeClass.GetMessage("test");
  10:   
  11:              //assert
  12:              Assert.AreEqual("test--", result);
  13:          }

需要增加一个Attribtue [HostType(“Moles”)] 对于MsTest,MSomeClass是Moles生成的并自动引用于Project上了,如上面代码你可以看到我们可以Mock 这个方法的实现了。 对于private的方法也可以,看下面的代码:

   1:          [TestMethod]
   2:          [HostType("Moles")]
   3:          public void TestPrivateMethodWithMoles()
   4:          {
   5:              //arrange
   6:              MSomeClass.AddTwentyItemInt32 = (i) => i + 2;
   7:              MSomeClass.AllInstances.AddTenItemInt32 = (SomeClass, i) => i + 1;
   8:              
   9:              //act
  10:              string result = new SomeClass().GetTotalItem(1);
  11:   
  12:              //assert
  13:              Assert.AreEqual("5", result);
  14:          }

就这么简单,上面的代码我们指定两个Private方法delegate,一个是Static method,另一个是Instance method,这里标记是AllInstances。 然后Call那个Public的方法,最后Assert。它们无缝地你的真正方法整合在一起做UnitTest。

希望对您的开发有帮助。


作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。

转载于:https://www.cnblogs.com/wintersun/archive/2011/08/09/2132340.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Charles

安装 https://www.jianshu.com/p/cb744a4c0344 https://blog.csdn.net/qq_28831197/article/details/81196571 使用说明: 来源:https://www.jianshu.com/p/73b134559c76 过滤网络请求 通常情况下,我们需要对网络请求进行过滤,只监…

.NET Core Docker使用初入篇

本篇内容如何在CentOS上安装Docker服务器与工具准备安装Docker更新系统安装Docker源设置Docker开机启动启动Docker使用Docker运行一个.NET Core 例子.net core 例子拉取.net core 例子停止.net core 例子启用其他如何在CentOS上安装Docker 服务器与工具准备 首先我们需要一个…

[html] 写一个布局,当页面滚动一定高时,导航始终固定在顶部,反之恢复原位

[html] 写一个布局,当页面滚动一定高时,导航始终固定在顶部,反之恢复原位 使用粘性定位,position:sticky 记得使用的时候父元素不能使用overflow:hidden和overflow:auto属性,而且必须要指定top/left/bottom/right中任…

C++学习记录

1.C中没有C#中所谓的引用类型和值类型&#xff0c;需要使用引用&#xff0c;或者指针操作对象&#xff0c;但是指针容易出错&#xff0c;为什么不用引用而用指针呢&#xff0c;下面给出总结 <1>引用在声明时必须初始化&#xff0c;指针可以是空指针&#xff0c;引用定义后…

如何延长作用域链_第4部分2:作用域(链)和 闭包

知识列表作用域/作用域链 闭包&#xff08;涉及JS垃圾回收机制 &#xff09;https://zhuanlan.zhihu.com/p/27110726 【 js 基础 】【读书笔记】作用域和闭包https://juejin.im/post/5afb0ae56fb9a07aa2138425 深入理解闭包之前置知识→作用域与词法作用域&#xff08;一&#…

nginx配置简介

一、安装部署环境&#xff1a;centos 7.21.离线安装&#xff1a;Nginx下载地址&#xff1a;http://nginx.org/en/download.html下载稳定版本nginx-1.16.0.tar.gz到/usr/local下进行解压安装&#xff1a; # ./configure --prefix/usr/local/nginx-1.16.0 --with-pcre \ # make &…

C# T4模板在项目中的使用

1.什么是t4模版 T4&#xff0c;即4个T开头的英文字母组合&#xff1a;Text Template Transformation Toolkit。 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中&#xff0c;“T4 文本模板”是由一些文…

[置顶] 再谈学习方法

之前写过一篇文章&#xff1a;浅谈Oracle学习方法http://blog.csdn.net/tianlesoftware/article/details/5448689这里不谈Oracle&#xff0c;只谈学习方法。 常说师傅领进门&#xff0c;修行靠个人。 研究Oracle 需要靠自己的学习&#xff0c;需要多花时间来研究&#xff0c;我…

[html] 举例说明HTML5出来后,有哪些HTML标签被弃用了?

[html] 举例说明HTML5出来后&#xff0c;有哪些HTML标签被弃用了&#xff1f; center u s font ..... 等等违反表现和结构分离原则的标签被弃用个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

python定义一个列表_如何在Python中创建用户定义的列表?

你需要将怪物的数量发送给使用它的函数&#xff1a;def welcome(): number monsters() print(Alright, str(number) monsters.) print(So, what are the names of these beasties?) # send number of monsters to monsterNames mNames monsterNames(number) 以及&#x…

Docker中安装Jenkins实时发布.net core 项目(一)

Docker中安装Jenkins实时发布.net core 项目安装docker懒人篇手动安装dockerfile安装jenkins常规安装jenkinsjenkins的安装搜索jenkins拉取jenkins容器jenkins的启动jenkins密码其他安装docker 使用curl安装最新版 curl -fsSL https://get.docker.com/ | sh重启Docker systemc…

nginx获取客户端请求的真实IP

客户端通过nginx代理访问后端jetty服务器时&#xff0c;后端服务器收到的请求信息中只有nginx代理的IP信息&#xff0c;无法看到client的真实IP&#xff0c; 所以nginx需要获取客户端请求头的真实IP地址进行传递&#xff0c;网上查资料一般配置如下&#xff1a; server {listen…

DP之八

//sicily 1166. Computer Transformat#include<iostream> //DP高精度using namespace std;#define M 50int Bit(int p){if(p0)return 1;int bit0;while(p!0) { p/10; bit; }return bit;}class Longint //高精度{public: Longin…

[html] H5怎么禁用长按复制的功能?

[html] H5怎么禁用长按复制的功能&#xff1f; // 禁止长按图片保存&#xff0c;设置img样式 -webkit-touch-callout: none; pointer-events: none; // 微信浏览器无法禁止&#xff0c;需加上这句// 禁止长按选择文字 -webkit-user-select: none;// 禁止长按呼出菜单 -webkit-…

python 3d大数据可视化_Python大数据可视化编程实践-绘制图表

Python 数据可视化编程实践 - 绘制图表 准备工作 打开 Jupyter Notebook &#xff0c;导入需要的包&#xff0c; 并配置好图片交互和中文显示环 境&#xff1a; import pandas as pd import numpy as np import sys reload(sys) sys.setdefaultencoding(utf-8) import matplotl…

Docker中安装Jenkins实时发布.net core 项目(二)

Docker中安装Jenkins实时发布.net core 项目防坑点升级dockerjenkins运行运行命令jenkins拉取git并构建项目其他查看发布文件防坑点 升级docker 首先我们要确认我们在liunx安装的不是1.31.1的docker容器不然在后面的运行中会报错 can not open /etc/sysconfig/docker如果你是…

sharepoint 2010 timejob 注意

每次改代码&#xff0c;需要执行: net stop SPTimerV4net start SPTimerV4转载于:https://www.cnblogs.com/Forest-zhu/archive/2011/08/23/2150658.html

[html] 404页面有什么作用?

[html] 404页面有什么作用&#xff1f; 404页面实际上跟HTTP Status 404类似&#xff0c;标识资源找不到。当然实际上404页面现在的玩法就多了&#xff0c;比如公益页面等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷…

http get 消息的作用是什么?_http基础知识

什么是http&#xff1f;HTTP 全称是 HyperText Transfer Protocol&#xff0c;即&#xff1a;超文本传输协议&#xff0c;从 1990 年开始就在 WWW 上广泛应用&#xff0c;是现今在 WWW 上应用最多的协议&#xff0c;HTTP 是应用层协议&#xff0c;当你上网浏览网页的时候&#…

Jenkins构建 netcore5.0 项目时出现NU3028/NU3037错误的解决方案

我在使用Jenkins自动化部署项目的时候&#xff0c;出现了如下的错误 error NU3028: Package System.IO.Compression 4.3.0 from source https://api.nuget.org/v3/index.json: The repository primary signatures timestamp found a chain building issue: UntrustedRoot: self…