Angular 17升级后单元测试报错:Cannot read properties of undefined (reading 'module')
解决方案:Angular 17升级后Spartacus 2211单元测试报错(Cannot read properties of undefined (reading 'module'))
针对你遇到的问题,核心原因是Spartacus 2211与Angular 17存在版本兼容性冲突,结合Spartacus项目的特性,可按以下步骤排查修复:
1. 同步升级Spartacus到兼容Angular 17的版本
Spartacus 2211(对应SAP Commerce Cloud 2211)官方适配的Angular版本为14.x~15.x,直接跨版本升级到Angular17会触发依赖不兼容问题。需先将Spartacus升级到支持Angular17的版本(如Spartacus 5.x及以上):
- 执行命令升级Spartacus核心包:
npm install @spartacus/core@5.x @spartacus/storefront@5.x @spartacus/assets@5.x - 同步更新所有Spartacus业务模块(如
@spartacus/cart、@spartacus/checkout等)到同版本 - 运行Angular升级工具对齐所有Angular依赖:
ng update @angular/core@17 @angular/cli@17
2. 修正测试模块初始化逻辑
Angular17对测试模块的依赖注入要求更严格,若你的UtilityService依赖Spartacus核心服务(如配置、状态管理类),需在测试模块中显式导入或提供必要依赖:
import { TestBed } from '@angular/core/testing'; import { ConfigModule } from '@spartacus/core'; import { UtilityService } from './utility.service'; describe('UtilityService', () => { let service: UtilityService; beforeEach(() => { TestBed.configureTestingModule({ // 导入Spartacus核心配置模块,确保基础服务可被注入 imports: [ConfigModule.withConfig({})], // 若服务依赖其他未在模块中暴露的服务,可手动Mock providers: [ // 示例:Mock OccEndpointsService { provide: OccEndpointsService, useValue: { getEndpoint: () => '' } } ] }); service = TestBed.inject(UtilityService); }); it('should be created', () => { expect(service).toBeTruthy(); }); });
3. 更新测试工具链依赖版本
Angular17要求测试工具(Karma、Jasmine)版本适配,需更新package.json中的测试相关依赖:
- 将
jasmine-core升级至^5.1.0 - 将
karma升级至^6.4.2 - 将
karma-jasmine升级至^5.1.0 - 将
karma-chrome-launcher升级至^3.2.0
执行npm install更新依赖后,重新运行测试:
ng test
4. 调整tsconfig.spec.json配置
确保测试环境的TypeScript配置适配Angular17:
{ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", "types": ["jasmine", "node"], "target": "ES2022", "module": "ES2022", "useDefineForClassFields": true }, "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] }
重点确认:
types数组包含jasmine和node,确保测试类型定义正常加载target和module设置为Angular17支持的ES版本useDefineForClassFields设为true(Angular17默认启用,避免类字段初始化冲突)
5. 检查全局测试入口文件(test.ts)
确保src/test.ts中的测试环境初始化代码适配Angular17:
import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; // 初始化测试环境,确保销毁策略正确 getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { teardown: { destroyAfterEach: true } } );
移除任何过时的测试初始化代码,避免与Angular17的测试API冲突。
内容的提问来源于stack exchange,提问作者Terry Windwalker
相关产品推荐
相关产品推荐

