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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:52:07