Jest监视从另一个内部调用的函数

时间:2018-03-02 11:58:22

标签: jestjs

我有以下两个文件:

functions.js

function getOne() {
  return 1;
}

function getTen() {
  let val = 0;
  for (let x = 0; x < 10; x++) {
    val+= getOne();
  }
  return val;
}

module.exports = {
                  getOne,
                  getTen,
                 }

functions.test.js

const numberFunctions = require('../functions.js');
const getOne = numberFunctions.getOne;
const getTen = numberFunctions.getTen;

// passes
test('I should be able to get the number 1', () => {
  expect(getOne()).toBe(1);
});

describe('The getTen function', () => {
  // passes
  it('should return 10', () => {
    expect(getTen()).toBe(10);
  });

  // fails
  it('should call the getOne method 10 times', () => {
    const spy = jest.spyOn(numberFunctions, 'getOne');
    expect(spy).toHaveBeenCalledTimes(10);
  });
});

我正在尝试确保从getTen函数中调用了函数getOne。总共应该调用10次,但我的间谍总是声称它被称为次。

我已经尝试重新安排我的测试,以便将getOne函数模拟为全局函数。

it('should call the getOne method 10 times', () => {
    global.getOne = jest.fn(() => 1);
    expect(global.getOne).toHaveBeenCalledTimes(10);
  });

但这会产生相同的结果。我如何监视从getTen函数中调用的getOne函数?

1 个答案:

答案 0 :(得分:0)

我设法通过更改getOne调用的getTen函数直接引用函数导出的函数来实现此功能。否则它似乎引用了一些内部范围的函数,它是导出的函数,这使得无法窥探。

这在this github conversation中有更详细的解释,但为了让我的测试按预期工作,意味着我必须重构我的代码:

function getOne() {
  return 1;
}

function getTen() {
  let val = 0;
  for (let x = 0; x < 10; x++) {
    val+= module.exports.getOne(); // <-- this line changed
  }
  return val;
}

module.exports = {
                  getOne,
                  getTen,
                 }

现在,内部函数不是内部作用域,而是指导出的函数,可以被监视。