我有以下两个文件:
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函数?
答案 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,
}
现在,内部函数不是内部作用域,而是指导出的函数,可以被监视。