在看到Jest模拟函数的那部分的时候,发现官方提供了一种模拟部分依赖的方法,下面看看官方文档给出的例子
// foo-bar-baz.js
export const foo = 'foo';
export const bar = () => 'bar';
export default () => 'baz';
//test.js
import defaultExport, {bar, foo} from '../foo-bar-baz';
jest.mock('../foo-bar-baz', () => {
// 真实的 foo-bar-baz 模块内容
const originalModule = jest.requireActual('../foo-bar-baz');
// Mock 默认导出和 foo 的内容
return {
__esModule: true,
...originalModule,
default: jest.fn(() => 'mocked baz'),
foo: 'mocked foo',
};
});
test('should do a partial mock', () => {
const defaultExportResult = defaultExport();
expect(defaultExportResult).toBe('mocked baz');
expect(defaultExport).toHaveBeenCalled();
expect(foo).toBe('mocked foo');
expect(bar()).toBe('bar');
});
我觉得主要就是在mock中用return对原来的方法进行覆盖
return {
__esModule: true,
// 原来引入的模块
...originalModule,
// 相当于用default,foo覆盖了原来Module中的方法
default: jest.fn(() => 'mocked baz'),
foo: 'mocked foo',
};
覆盖之后相当于
// foo-bar-baz.js
export const foo = 'mocked foo';
export const bar = () => 'bar';
export default () => 'mocked baz';