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

运行Jest单元测试时出现TypeError: mxgraph is not a function错误的解决方案咨询

解决mxgraph在Jest测试中报错TypeError: mxgraph is not a function的问题

你遇到的这个问题,核心原因是Jest对模块的加载解析逻辑和Webpack存在差异:mxgraph是一个UMD格式的模块,在Webpack环境下它会被正确识别为可调用的函数,但Jest加载时会直接把它当作普通模块导出,导致你调用mxgraph()时触发函数类型错误。

下面给你两种可行的解决办法:

方法一:在单个测试文件中局部Mock mxgraph

如果只是个别测试文件需要用到这个组件,你可以在测试文件(比如step_attach_directories_task_template.spec.js)的顶部添加Mock代码,模拟mxgraph的导出结构:

// Mock主mxgraph模块
jest.mock('mxgraph', () => {
  return jest.fn(() => ({
    mxClient: {},
    mxStackLayout: jest.fn(),
    mxGraph: jest.fn(),
    mxRubberband: jest.fn(),
    mxUtils: {},
    mxFastOrganicLayout: jest.fn(),
    mxSwimlaneLayout: jest.fn(),
    mxEvent: {},
    mxGraphModel: jest.fn(),
    mxConstants: {},
    mxHierarchicalLayout: jest.fn(),
    mxSwimlaneManager: jest.fn()
  }));
});

// Mock单独导入的mxConstants
jest.mock('mxgraph/javascript/mxClient.js', () => ({
  mxConstants: {}
}));

这样Jest在加载mxgraph模块时会使用你定义的Mock对象,而非真实模块,自然就不会触发调用错误。

方法二:在jest.config.js中全局配置Mock

如果多个测试文件都需要用到该组件,推荐全局配置Mock,避免重复代码:

  1. 先修改你的jest.config.js,添加moduleNameMapper配置:
module.exports = {
  preset: "@vue/cli-plugin-unit-jest/presets/no-babel",
  moduleFileExtensions: ["js", "ts", "json", "vue"],
  transform: { ".*\\.(vue)$": "vue-jest", "^.+\\.tsx?$": "ts-jest" },
  globals: { "ts-jest": { tsConfig: "src/tsconfig.json" } },
  // 新增模块映射配置
  moduleNameMapper: {
    '^mxgraph$': '<rootDir>/__mocks__/mxgraph.js',
    '^mxgraph/javascript/mxClient.js$': '<rootDir>/__mocks__/mxClient.js'
  }
};
  1. 在项目根目录创建__mocks__文件夹,然后创建两个Mock文件:
  • __mocks__/mxgraph.js:
module.exports = jest.fn(() => ({
  mxClient: {},
  mxStackLayout: jest.fn(),
  mxGraph: jest.fn(),
  mxRubberband: jest.fn(),
  mxUtils: {},
  mxFastOrganicLayout: jest.fn(),
  mxSwimlaneLayout: jest.fn(),
  mxEvent: {},
  mxGraphModel: jest.fn(),
  mxConstants: {},
  mxHierarchicalLayout: jest.fn(),
  mxSwimlaneManager: jest.fn()
}));
  • __mocks__/mxClient.js:
module.exports = {
  mxConstants: {}
};

配置完成后,所有测试文件都会自动使用这些Mock模块,无需再逐个文件添加Mock代码。

注意:如果你需要在测试中使用mxgraph的真实功能,还需要将Jest的testEnvironment设置为jsdom,并额外处理mxgraph依赖的DOM环境,但一般单元测试中用Mock足以覆盖组件逻辑验证的需求。

内容的提问来源于stack exchange,提问作者Pablo Estrada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:52:48