Ale*_*ire 6 javascript mocking node.js jestjs
我正在测试fileA.js,这需要fileB.js
在 中fileA.test.js,我希望模拟fileB.js除一个之外的所有方法。
在fileA.test.js我有:
const common = require("../src/fileB");
jest.mock("../src/fileB");
Run Code Online (Sandbox Code Playgroud)
有一种方法我不想被嘲笑。这种事情在 nodeJS 中可能吗?
谢谢你。
您可以使用jest.mock和jest.requireActual(moduleName)来部分模拟模块的方法/功能。
例如:
a.js:
const b = require('./b');
exports.main = function main() {
console.log(b.method1());
console.log(b.method2());
console.log(b.method3());
};
Run Code Online (Sandbox Code Playgroud)
b.js:
module.exports = {
method1: function() {
return 'method 1';
},
method2: function() {
return 'method 2';
},
method3: function() {
return 'method 3';
}
};
Run Code Online (Sandbox Code Playgroud)
现在,我们将模拟b.jsexcept 的所有方法method3。
a.spec.js:
jest.mock('./b', () => {
const originalB = jest.requireActual('./b');
const partialMockedB = Object.keys(originalB).reduce((pre, methodName) => {
pre[methodName] = jest.fn();
return pre;
}, {});
return {
...partialMockedB,
method3: originalB.method3 // mock all methods of b except method3
};
});
const { main } = require('./a');
const b = require('./b');
describe('main', () => {
test('should correct', () => {
const logSpy = jest.spyOn(console, 'log');
b.method1.mockReturnValueOnce('mocked method 1');
b.method2.mockReturnValueOnce('mocked method 2');
main();
expect(logSpy.mock.calls[0]).toEqual(['mocked method 1']);
expect(logSpy.mock.calls[1]).toEqual(['mocked method 2']);
expect(logSpy.mock.calls[2]).toEqual(['method 3']);
});
});
Run Code Online (Sandbox Code Playgroud)
单元测试结果:
PASS src/stackoverflow/58561765/a.spec.js
main
? should correct (18ms)
console.log node_modules/jest-mock/build/index.js:860
mocked method 1
console.log node_modules/jest-mock/build/index.js:860
mocked method 2
console.log node_modules/jest-mock/build/index.js:860
method 3
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 3.65s
Run Code Online (Sandbox Code Playgroud)
源代码:https : //github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58561765