You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:39:19