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 删除了实现细节,它让您可以访问它是否被调用以及它是如何被调用的。

当我们不想丢失实现细节时,

callThroughreturnValuecallFake 间谍就会发挥作用。

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,因为我们将侦测函数的实现细节更改为乘法而不是加法。