Jest测试报TypeError: (0 , _x) is not a function错误
报错根因
你遇到的TypeError: (0 , _utils.reverseMapper) is not a function和const声明导出、import/require导入方式没有任何关系,问题出在Jest mock的写法上:
- 你当前写的
jest.mock('../myUtils', () => ({getJson: jest.fn()}))会完全覆盖myUtils模块的所有原有导出,整个模块只会剩下你手写的mock版getJson。 - 你认为
reverseMapper和getJson不属于同一模块,本质是没注意到myUtils作为工具入口文件,大概率做了跨模块重导出(比如存在export { reverseMapper } from './other-utils'这类转导出语法),你测试中调用的somethingElse业务逻辑,在依赖链路里就是从myUtils入口导入的reverseMapper。 - mock之后
reverseMapper的导出值变成了undefined,只要代码执行到调用它的逻辑就会抛错,和你有没有在测试代码里直接调用这个函数没有关系。
修复方案
根据实际测试需求选对应方案即可:
方案1:仅mock getJson,保留模块其余真实逻辑
这是绝大多数场景下的正确写法,用jest.requireActual引入原模块的所有真实导出,只覆盖你需要替换的方法:
import { getJson } from "../myUtils"; jest.mock('../myUtils', () => ({ // 加载原模块所有真实导出 ...jest.requireActual('../myUtils'), // 仅覆盖需要mock的getJson getJson: jest.fn(), }));
方案2:不需要其他方法逻辑时补全mock
如果你确认测试链路不需要执行reverseMapper的真实逻辑,直接在mock对象里补上对应方法的空mock,避免undefined调用:
jest.mock('../myUtils', () => ({ getJson: jest.fn(), reverseMapper: jest.fn(), // 其余被依赖的从myUtils导出的方法如果报同类错,按同样方式补mock即可 }));
额外排查点
如果上述修改后仍报错,检查两个常见问题:
- 所有
jest.mock调用必须放在测试文件顶层、import语句之后,不要写在测试用例it块内部,否则会出现模块加载时序错乱,导致导出值异常 - 检查是否存在模块循环依赖:如果
myUtils和定义reverseMapper的模块存在互相导入的情况,会导致模块加载时对应导出还未初始化,拿到undefined值,这种情况需要调整模块拆分逻辑,解开循环依赖。
内容的提问来源于stack exchange,提问作者monsterpiece
相关产品推荐
相关产品推荐

