ng-mocks搭配jest-preset-angular使用时触发ES Module导入报错
问题环境与现象
- 项目测试相关依赖版本:
ng-mocks@13.5.2、jest-preset-angular@12、@ngneat/spectator@11 - 触发条件:spec测试文件中调用
MockComponents或MockPipe方法时固定抛出异常 - 核心报错信息:
Must use import to load ES Module: /Users/scott/ltr/ltr/node_modules/@angular/core/fesm2020/core.mjs.
- 关键错误堆栈:
at Runtime.requireModule (node_modules/jest-runtime/build/index.js:1011:21) at node_modules/ng-mocks/webpack:/ng-mocks/webpack/universalModuleDefinition:3:36 at Object.__WEBPACK_EXTERNAL_MODULE__8900__ (node_modules/ng-mocks/webpack:/ng-mocks/webpack/universalModuleDefinition:10:19)
排查解决步骤
- 先检查Jest模块转换配置
该报错的核心原因是Jest默认以CommonJS规则加载模块,碰到Angular输出的ESM格式.mjs文件未做转译就会触发。打开项目根目录的jest.config.js,确认transformIgnorePatterns配置没有把@angular、ng-mocks相关包纳入忽略转译的范围,正确配置参考:
该配置表示node_modules目录下只有@angular、ng-mocks开头的包会走Jest转译流程,其余依赖保持默认不转译,兼顾运行速度和模块兼容性。transformIgnorePatterns: ['node_modules/(?!(@angular|ng-mocks)/)'] - 修复依赖版本错配问题
当前使用的三个测试依赖存在明确的大版本适配断层:jest-preset-angular@12是为Angular 14及以上版本设计的,配套要求ng-mocks版本≥14.0.0、@ngneat/spectator版本≥12.0.0;当前安装的ng-mocks 13.x、@ngneat/spectator 11.x都是适配Angular 13及更低版本的,跨大版本混用会导致ng-mocks内部的模块识别逻辑无法匹配Angular包的ESM输出格式,直接触发加载错误。根据项目实际使用的Angular版本对齐依赖即可:- 若项目为Angular 13版本,将
jest-preset-angular降级到11.x对应版本 - 若项目为Angular 14及以上版本,将
ng-mocks升级到14.x以上版本、@ngneat/spectator升级到12.x以上版本
版本调整完成后删除node_modules目录和包管理锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml),重新执行依赖安装命令。
- 若项目为Angular 13版本,将
- 补全ESM模块识别配置
如果前两步调整后仍报错,检查jest.config.js中的extensionsToTreatAsEsm配置,将.mjs后缀加入识别列表:
同时确认jest-preset-angular的ESM相关配置项已开启,确保Jest运行时能正确处理ESM格式的依赖包。extensionsToTreatAsEsm: ['.mjs', '.ts'] - 校验测试文件导入写法
检查所有spec测试文件,MockComponents、MockPipe以及Angular核心API必须使用ES模块的import语法导入,禁止用require()方式加载这类ESM格式的包,CommonJS规范的导入方法会直接触发该类模块加载错误。
内容的提问来源于stack exchange,提问作者Gargoyle
相关产品推荐
相关产品推荐

