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
相关产品推荐
相关产品推荐

