热门标签 | 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的基本用法。

 


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
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社区 版权所有