Jest如何Mock包模块命名导出类的指定方法保留其余实现
Jest mock 实现方案
核心需求是保留@foo-bar/package除Component1的save()方法外的所有真实逻辑,实现方式如下:
jest.mock('@foo-bar/package', () => { // 加载目标模块的全部真实导出 const actualPackage = jest.requireActual('@foo-bar/package'); // 继承原始Component1,完整保留所有原属性、生命周期、render逻辑 class PatchedComponent1 extends actualPackage.Component1 { // 仅替换save方法为jest mock函数 save = jest.fn(/* 可按需传入自定义mock实现,如需保留原逻辑可调用 super.save() */); } return { __esModule: true, // 兼容ES Module import语法 ...actualPackage, Component1: PatchedComponent1, }; })
实现说明
- 通过
jest.requireActual获取模块的未mock原生实现,保证Component2、Component1除save外的所有逻辑完全和生产环境一致 - 采用类继承的方式扩展原Component1,不会污染原始模块的组件实现,避免多测试用例间的状态干扰
- 替换后的
save是标准jest mock实例,支持toHaveBeenCalled、toHaveBeenCalledWith等所有jest mock断言方法 - 如果需要在特定场景下执行原save的逻辑,只需要在mock函数内调用
super.save()即可,也可在用例中通过mockImplementation动态修改save的行为 - 必须添加
__esModule: true标记,否则ES模块的具名导入可能出现解析异常
内容的提问来源于stack exchange,提问作者xertzer
相关产品推荐
相关产品推荐

