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

Jest单元测试失败:MsalModule缺少ɵmod属性模块定义

「MsalModule 缺失ɵmod属性」报错排查与解决方案

这个报错的核心原因是Jest运行时加载的@azure/msal-angular产物未经过Angular Ivy编译,和你怀疑的Ivy编译逻辑、es2015/esm2015产物错误加载直接相关,按以下顺序排查即可:

1. 先核对依赖版本匹配性

  • 首先确认@azure/msal-angular版本和项目Angular主版本严格对应:Angular 12+需使用msal-angular 2.x以上版本;Angular 13及以上版本已彻底移除View Engine支持,必须使用msal-angular 2.3+的原生Ivy编译版本,版本不匹配直接升级/降级到兼容区间。
  • 执行npm ls @azure/msal-angular @azure/msal-browser检查是否存在多版本嵌套副本,若存在旧版本嵌套,在package.json中通过overrides(npm 8+)或resolutions(yarn/pnpm)字段强制锁定单版本,避免运行时加载到嵌套的旧版本产物。

2. 修正Jest模块解析配置

Jest默认走CommonJS解析逻辑,大概率会错误命中msal-angular包内未带Ivy定义的es2015格式入口,需要调整jest配置:

  • 将msal相关包加入编译白名单,避免被默认的transform忽略规则跳过编译:
// jest.config.js
module.exports = {
  preset: 'jest-preset-angular',
  transformIgnorePatterns: [
    'node_modules/(?!(@azure/msal-angular|@azure/msal-browser)/)'
  ],
  // 强制指定Ivy编译后的FESM产物入口,不要指向es2015目录下的旧产物
  moduleNameMapper: {
    '@azure/msal-angular': '<rootDir>/node_modules/@azure/msal-angular/fesm2020/azure-msal-angular.mjs'
  }
}

如果使用Angular 14+,将入口路径替换为对应fesm2022目录下的文件即可。

3. 调整测试用例中的模块引入方式

  • 单元测试中不能直接引入未初始化的MsalModule,必须调用.forRoot()传入配置后再加入TestBed的imports列表:
import { MsalModule, MsalService } from '@azure/msal-angular';
import { PublicClientApplication } from '@azure/msal-browser';

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [
      MsalModule.forRoot(new PublicClientApplication({
        auth: { clientId: 'test-unit-client-id' }
      }), null, null)
    ],
    providers: [MsalService]
  })
})
  • 如果测试用例不需要验证MSAL鉴权逻辑,直接打桩替换MsalService是更稳定的方案,不需要在测试中加载真实MsalModule:
class MockMsalService {
  loginPopup = jest.fn().mockResolvedValue({});
  logout = jest.fn().mockResolvedValue({});
  instance = { getAllAccounts: () => [] };
}

beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [
      { provide: MsalService, useClass: MockMsalService }
    ]
  })
})

4. 校验Ivy配置与编译缓存

  • 检查tsconfig.spec.json中的angularCompilerOptions配置,确认enableIvy没有被显式设置为false,Angular 13+可以直接删除该配置项,默认开启Ivy编译。
  • 如果之前存在编译缓存,执行rm -rf node_modules/.cache/ngcc清除旧的ngcc编译产物缓存,重新执行npx ngcc触发所有依赖包的Ivy兼容编译后再运行测试。

内容的提问来源于stack exchange,提问作者Rafael Guimaraes Siqueira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:24:23