我有我的函数对象,我想测试一个方法是否调用了另一个方法,但 spy 似乎失败了,因为测试表明这是因为根本没有调用该函数。我正在添加代码。
index.js
const funcObject = () => {
const firstFunc = () => {
console.log('first func!')
};
const secondFunc = () => {
firstFunc();
console.log('second func!');
}
return {
firstFunc,
secondFunc
};
};
module.exports = funcObject;
index.test.js
const funcObject = require('./index');
describe('second func tests', () => {
it('should call first func', () => {
const funcObjectOutput = funcObject();
const firstFuncSpy = jest.spyOn(funcObjectOutput, 'firstFunc');
funcObjectOutput.secondFunc();
expect(firstFuncSpy).toHaveBeenCalled();
})
})
package.json
{
"name": "jest-mock",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "jest"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/jest": "^26.0.20",
"jest": "^26.6.3"
}
}
答案 0 :(得分:1)
jest.spyOn(funcObjectOutput, 'firstFunc')
用模拟函数替换 funcObjectOutput['firstFunc']
。所以 firstFuncSpy
是模拟的而不是原始的。并且 expect(firstFuncSpy).toHaveBeenCalled()
检查模拟函数是否已被调用。但是 secondFunc
调用了原来的 firstFunc
。
见jest.spyOn
的代码。
https://github.com/facebook/jest/blob/dd1309652334ab14544cf3ecb177faae68059832/packages/jest-mock/src/index.ts#L951
答案 1 :(得分:0)
目前,在 firstFunc()
中调用的 secondFunc()
将是原始函数,而不是间谍版本。
为了监视或模拟 firstFunc()
函数,您需要检索它的引用。这样,当secondFunc()
函数被调用时,被监听的firstFunc()
函数就会被调用。有关详细信息,请参阅此 How to mock specific module function?
例如
index.js
:
const funcObject = () => {
const obj = {};
const firstFunc = () => {
console.log('first func!');
};
const secondFunc = () => {
obj.firstFunc();
console.log('second func!');
};
obj.firstFunc = firstFunc;
obj.secondFunc = secondFunc;
return obj;
};
module.exports = funcObject;
index.test.js
:
const funcObject = require('./index');
describe('second func tests', () => {
it('should call first func', () => {
const funcObjectOutput = funcObject();
const firstFuncSpy = jest.spyOn(funcObjectOutput, 'firstFunc');
funcObjectOutput.secondFunc();
expect(firstFuncSpy).toHaveBeenCalled();
});
});
测试结果:
PASS examples/66657164/index.test.js
second func tests
✓ should call first func (19 ms)
console.log
first func!
at Object.firstFunc (examples/66657164/index.js:4:13)
console.log
second func!
at Object.secondFunc (examples/66657164/index.js:8:13)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 5.69 s