我正在尝试测试一个依赖于同一模块中另一个函数的函数。我想模拟第二个,我尝试过的方法如下:
utils.js
:
const buildEngine = () => 'Engine';
const buildCar = () => {
const engine = buildEngine();
return engine + ' and ' + 'Car Body';
};
module.exports = {
buildEngine,
buildCar
};
utils.spec.js
:
function mockModule() {
const original = require.requireActual('./utils');
return { ...original, buildEngine: jest.fn(() => 'Mock Engine') };
}
it('Builds a Car', () => {
jest.mock('./utils', () => mockModule());
const utils = require.requireMock('./utils');
expect(utils.buildEngine()).toBe('Mock Engine');
expect(utils.buildCar()).toBe('Mock Engine and Car Body');
});
发生的情况是,即使我能够模拟“buildEngine”函数,当我测试“buildCar”函数时,它仍然引用未模拟的“buildEngine”。 请帮忙。
最佳答案
解决方案如下:
utils.js
:
const buildEngine = () => 'Engine';
const buildCar = () => {
const engine = exports.buildEngine();
return engine + ' and ' + 'Car Body';
};
exports.buildEngine = buildEngine;
exports.buildCar = buildCar;
utils.spec.js
:
const utils = require('./utils');
describe('utils', () => {
it('Builds a Car', () => {
const buildEngineSpy = jest.spyOn(utils, 'buildEngine').mockReturnValue('Mock Engine');
expect(utils.buildCar()).toBe('Mock Engine and Car Body');
expect(buildEngineSpy).toBeCalledTimes(1);
buildEngineSpy.mockRestore();
});
it('build engine original implementation', () => {
expect(utils.buildEngine()).toBe('Engine');
expect(utils.buildCar()).toBe('Engine and Car Body');
});
});
单元测试结果:
PASS src/stackoverflow/46437290/utils.spec.js
utils
✓ Builds a Car (4ms)
✓ build engine original implementation (1ms)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 1.908s, estimated 2s
这是已完成的演示:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/46437290
关于jestjs - 开 Jest : how to mock a function which is used by another function of the same module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46437290/