Jest Mock模块单个导出函数时出现未定义错误的解决方法
解决Jest Mock模块时functionName未定义的问题
问题根源很明确:你用jest.mock直接替换了整个模块的导出对象,但只在返回值里定义了functionName1,原模块的functionName自然就从导出里消失了,导入后肯定会报未定义错误。给你几个可行的解决办法:
办法一:保留原模块所有导出,仅替换目标函数
用jest.requireActual获取模块的真实导出,再覆盖需要mock的functionName1,这样其他导出都会被保留:
jest.mock('../path', () => { // 获取原模块的真实导出内容 const actualModule = jest.requireActual('../path'); return { // 展开原模块所有导出 ...actualModule, // 替换functionName1为mock函数 functionName1: jest.fn() }; });
办法二:手动在mock中定义所有需要的导出
如果不需要functionName的真实实现,也可以直接在mock对象里手动声明它:
jest.mock('../path', () => { return { // 可以根据测试需求定义mock实现 functionName: jest.fn(), functionName1: jest.fn() }; });
办法三:用spyOn单独mock目标函数
如果只是想替换functionName1的实现,同时保留functionName的真实逻辑,更推荐用jest.spyOn,不用替换整个模块:
import * as Module from '../../module.ts'; // 监听Module导出的functionName1,替换为mock函数 jest.spyOn(Module, 'functionName1').mockImplementation(() => { // 这里可以写mock的返回值或逻辑 });
内容的提问来源于stack exchange,提问作者Shyam SS
相关产品推荐
相关产品推荐

