testing - Jasmine:callThrough 和 callFake
问题描述
我刚刚开始在 Jasmine 中进行调查,目前,我无法理解调用、返回值和调用假间谍。
我阅读了官方文档,但对我来说没有多大意义。此外,我尝试在 StackOverflow 或 Google 上搜索答案,但找不到足够的解释。
谁能以更友好的方式解释它?:)
解决方案
当您监视一个方法时,您将转换该方法,以便能够在调用它时保留它,它被调用了多少次以及它被调用的参数是什么。
class X {
addNums(x + y) {
return x + y;
}
}
const x = new X();
const addNumsSpy = spyOn(x, 'addNums');
const result = x.sayHello(1, 2);
expect(addNumsSpy).toHaveBeenCalled();
expect(addNumsSpy).toHaveBeenCalledWith(1, 2);
expect(addNumsSpy).toHaveBeenCalledTimes(1);
console.log(result);
上面的结果将是不确定的,因为我们在addNums
. 你会期望它是 3,但它不会是因为间谍。简而言之,一个 spyOn 删除了实现细节,它让你可以访问它是否被调用以及它是如何被调用的。
callThrough
当我们不想丢失实现细节时, , returnValue
, 和spies 就会发挥作用。callFake
callThrough 基本上说使用实现细节(不要存根未定义)。
const x = new X();
const addNumsSpy = spyOn(x, 'addNums').and.callThrough();
const result = x.sayHello(1, 2);
expect(addNumsSpy).toHaveBeenCalled();
expect(addNumsSpy).toHaveBeenCalledWith(1, 2);
console.log(result);
上面的结果将是 3 因为我们说callThrough
(实际上是为我们调用该函数)。
returnValue 立即返回值,忽略实现细节
const x = new X();
const addNumsSpy = spyOn(x, 'addNums').and.returnValue(1000);
const result = x.sayHello(1, 2);
expect(addNumsSpy).toHaveBeenCalled();
expect(addNumsSpy).toHaveBeenCalledWith(1, 2);
console.log(result);
上面的结果将是 1000,因为returnValue
(忽略实现细节并返回此值)
callFake 允许您在每次调用间谍函数时调用另一个函数。
const x = new X();
const addNumsSpy = spyOn(x, 'addNums').and.callFake((num1, num2) => {
console.log(num1, num2);
return num1 * num2;
});
const result = x.sayHello(1, 2);
expect(addNumsSpy).toHaveBeenCalled();
expect(addNumsSpy).toHaveBeenCalledWith(1, 2);
console.log(result);
前面的结果应该是 2,因为我们将 spied 函数的实现细节改为乘法而不是加法。
推荐阅读
- latex - LaTeX - 图像上的简单文本
- c++ - 从 QFontDatabase 设置 QFont 将所有标签设置为等宽字体?Qt C++
- c# - MSBUILD 排除 cs 文件
- terraform - Terraform Cognito 身份池身份验证提供程序
- javascript - 在多个模态中使用缩略图前一个模态缩略图显示到下一个模态
- html - 即使滚动主要内容,如何使固定侧边栏保持在一个位置
- c# - 如何在单独的 .cs 文件中调用 onkeydown 事件
- azure-devops - Azure 中的 Mermaid JS 语法损坏?
- php - 如何将 PDO::FETCH_GROUP 与表连接一起使用,并且只返回按日期排序的连接表中的 3 条记录
- c# - 使用 C# 的基本身份验证在消息中添加新的换行符