[英]Jest: Mocking third-party modules
我最近一直在尝试使用 Jest 学习单元测试,阅读文档和各种文章。
我无法弄清楚的一件事是:
我正在尝试测试一个以os.platform()
条件的if
语句的 nodeJS 模块。
我的测试有什么方法可以将os.platform
返回值设置/模拟为os.platform
值,因此当 Jest 运行测试文件时,测试文件将读取测试套件中指定的 os.platform() 值?
PS: foo()
不能通过依赖注入接受平台。 foo()
的实现是固定的。
我的模块.js
import os from 'os';
export const foo = () => {
if (os.platform() === `win32`) {
module = module.split(`\\`).join(`\\\\`);
}
}
myModule.test.js
import * as myModule from '../myModule.js';
// Guessing I need to use spyOn, to test the actual module code?
const myModuleMock = jest.spyOn(myModule, 'foo');
describe('myModule', () => {
it('can run with different os.platform() values', () => {
myModuleMock();
expect(myModuleMock).toHaveBeenCalled();
// How do I specify what value os.platform() in foo() should return?
});
});
您可以将os
导入您的测试文件并使用jest.spyOn
像这样模拟它:
import * as myModule from '../myModule.js';
import os from 'os';
describe('myModule', () => {
it('can run with different os.platform() values', () => {
const spy = jest.spyOn(os, 'platform');
spy.mockReturnValue('mocked response'); // <= mock the return value
myModule.foo();
expect(spy).toHaveBeenCalled(); // Success!
});
});
我更喜欢这种方法,因为它使模拟更接近它所影响的测试。
如果你想使用带有工厂函数的jest.mock
那么你可以这样做:
jest.mock('os', () => {
const os = jest.requireActual('os');
jest.spyOn(os, 'platform').mockReturnValue('mocked response');
return os;
});
请注意,工厂函数必须是完全独立的。
您可以通过在__mocks__
目录上添加os.js
文件来模拟os
模块:
// ./__mocks__/os.js
const os = jest.requireActual('os')
os.platform = jest.fn().mockReturnValue('testPlatform')
module.exports = os
// ./tests/whatever/some.test.js
import os from 'os'
jest.mock('os')
test('os', () => {
expect(os.platform()).toBe('testPlatform') // ✔️
})
或者,只有一个文件:
const mockOS = jest.requireActual('os')
mockOS.platform = jest.fn().mockReturnValue('testPlatform')
jest.mock('os', () => mockOS)
import os from 'os'
test('os', () => {
expect(os.platform()).toBe('testPlatform')
})
所以你的测试文件应该是这样的:
const mockOS = jest.requireActual('os')
mockOS.platform = jest.fn().mockReturnValue('testPlatform')
jest.mock('os', () => mockOS)
import * as myModule from '../myModule.js';
describe('myModule', () => {
it('can run with different os.platform() values', () => {
myModuleMock();
expect(myModuleMock).toHaveBeenCalled();
});
});```
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.