Jasmine:callThrough 和 callFake
Jasmine: callThrough and callFake
我刚刚开始调查 Jasmine,目前,我无法理解 call through、return 值和 call fake spies。
我看了官方文档,但对我来说意义不大。此外,我试图在 Whosebug 或 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
和 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
(其实是给我们调用了函数)
return值return立即忽略实现细节的值
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);
由于 returnValue
(忽略实现细节和 return 这个值)
,上面的结果将是 1000
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,因为我们将侦测函数的实现细节更改为乘法而不是加法。
我刚刚开始调查 Jasmine,目前,我无法理解 call through、return 值和 call fake spies。
我看了官方文档,但对我来说意义不大。此外,我试图在 Whosebug 或 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
和 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
(其实是给我们调用了函数)
return值return立即忽略实现细节的值
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);
由于 returnValue
(忽略实现细节和 return 这个值)
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,因为我们将侦测函数的实现细节更改为乘法而不是加法。