首页 > 解决方案 > Jasmine:callThrough 和 callFake

问题描述

我刚刚开始在 Jasmine 中进行调查,目前,我无法理解调用、返回值和调用假间谍。

我阅读了官方文档,但对我来说没有多大意义。此外,我尝试在 StackOverflow 或 Google 上搜索答案,但找不到足够的解释。

谁能以更友好的方式解释它?:)

标签: testingjasminekarma-jasmine

解决方案


当您监视一个方法时,您将转换该方法,以便能够在调用它时保留它,它被调用了多少次以及它被调用的参数是什么。

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 函数的实现细节改为乘法而不是加法。


推荐阅读