在看到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';