热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于遗留代码的测试

在大多时候代码的测试很难,因为很多代码无法进行参数注入,那么这个时候有一款不受限的隔离框架TypeMock供你使用,不过遗憾这款软件是付费的一个隔离框架,有15天的免费使用权,如果能解决你现有

    在大多时候代码的测试很难,因为很多代码无法进行参数注入,那么这个时候有一款不受限的隔离框架TypeMock供你使用,不过遗憾这款软件是付费的一个隔离框架,有15天的免费使用权,如果能解决你现有的问题我想这份费用并不能算多。TypeMock的官方下载http://www.typemock.com/。下面开始看看TypeMock是怎么样使用的。

1:伪造一个静态的方法来看一个例子

被测试的静态方法

public static int DoSomethingSpecialOnALeapYear()
{
if ((DateTime.Now.MOnth== 3) && (DateTime.Now.Day == 29))
return 100;
return 0;
}
DoSomethingSpecialOnALeapYear

测试方法

1 [TestMethod, Isolated]
2 public void FakingDateTime()
3 {
4 Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2016, 3, 29));//当调用当前时间的时候会返回指定的时间
5 int result = MyStatic.DoSomethingSpecialOnALeapYear();
6 Assert.AreEqual(100, result);
7 }
FakingDateTime

2:伪造一个sealed的类

被测试的静态方法

 1 public static bool SignedIn { get; set; }
2
3 public static bool SignOut(HttpContext current)
4 {
5 if (SignedIn)
6 {
7 HttpSessionState session = current.Session;
8 session.Abandon();
9 return true;
10 }
11 return false;
12 }
SignOut

如果我们要保证上面的方法能不在依赖HttpContext 那么我们必须要注入这个依赖我们看测试代码

1 [TestMethod, Isolated]
2 public void FakingHttpContext()
3 {
4 var fakeHttp = Isolate.Fake.Instance();//需要注入的伪对象
5 MyStatic.SignedIn = true;
6 var result = MyStatic.SignOut(fakeHttp);
7 Assert.AreEqual(true, result);
8 }
FakingHttpContext

3:重写伪造类中的方法

如果一些类现在要按照我们的需要来返回相应的值我们来看看下面这个例子

1 public static bool IsMySiteNameTypemock(Process process)
2 {
3 var name = process.MachineName;
4 if (process.MainModule.Site.Name.StartsWith("Typemock"))
5 return true;
6 else
7 return false;
8 }
IsMySiteNameTypemock

为了上面的程序正常工作那么我们必须需要通过site.Name以Typemock开始所以在测试中我们必须这么做

1 [TestMethod, Isolated]
2 public void SetBehaviorOnChainExample()
3 {
4 var fake = Isolate.Fake.Instance();
5 Isolate.WhenCalled(() => fake.MainModule.Site.Name).WillReturn("Typemock rocks");//设置Site.Name
6 var result = MyStatic.IsMySiteNameTypemock(fake);
7 Assert.AreEqual(true, result);
8 }
SetBehaviorOnChainExample

现在我们来运行测试一下看看结果

4:跳过某一个异常的方法

如果在一个方法体中要先执行一个方法(一个依赖项)然后在执行后面的代码下面我们在来看这个例子

1 public class Dependency//一个依赖项
2 {
3 public virtual void CheckSecurity(string name, string password)
4 {
5 throw new SecurityException();
6 }
7 }
Dependency
1 public int Calculate(int a, int b, Dependency dependency)
2 {
3 dependency.CheckSecurity("typemock", "rules");
4 return a + b;
5 }
Calculate

然后我们进行需要跳过CheckSecurity这个会报异常的方法来看看例子

1 [TestMethod, Isolated]
2 public void FakeMethod_OnLiveObject() {
3 var dependency = new Dependency();
4 Isolate.WhenCalled(() => dependency.CheckSecurity(null, null)).IgnoreCall();//不去管这个方法的调用
5 var classUnderTest = new ClassUnderTest();
6 var result = classUnderTest.Calculate(1, 2, dependency);
7 Assert.AreEqual(3, result);
8 }
FakeMethod_OnLiveObject

5:在未来某个方法体中创建伪对象

比喻在一个放法A中我们会依赖一个B类那么这个在内部实例化的那么我们该怎么办呢。看下面这个例子

这个外部的依赖项依然是上面的Dependency。

现在我们来修改Calculate这个方法体如下

1 public static int Calculate(int a, int b) {
2 var dependency = new Dependency();
3 dependency.CheckSecurity("typemock", "rules");
4 return a + b;
5 }
Calculate

我们在Calculator中直接去实例化Dependency这个对象了。

那么我们来看看怎么去注入这个伪对象

1     [TestMethod, Isolated]
2 public void FakeConstructor() {
3 var fakeHandle = Isolate.Fake.NextInstance();//不需要注入在未来进行创建的伪对象
4 var result = ClassUnderTest.Calculate(1, 2);
5 Assert.AreEqual(3, result);
6 }
FakeConstructor

我们采用了NextInstance这个表示在未来的某个方法体中去创建这个伪对象。ok我们来看下测试的效果

上面就简单介绍了一个typemock的基本用法。

 


推荐阅读
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 利用Flask框架进行高效Web应用开发
    本文探讨了如何利用Flask框架高效开发Web应用,以满足特定业务需求。具体案例中,一家餐厅希望每天推出不同的特色菜,并通过网站向顾客展示当天的特色菜。此外,还增加了一个介绍页面,在bios路径下详细展示了餐厅主人、厨师和服务员的背景和简介。通过Flask框架的灵活配置和简洁代码,实现了这一功能,提升了用户体验和餐厅的管理水平。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
author-avatar
蚂蚁少校
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有