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

Angular 14中inject()的使用及测试代码适配方案

适配inject()写法的测试代码调整方案

当你把服务的注入方式从构造器改为inject()函数后,直接用new ResetService()创建实例会报错——因为inject()必须在Angular的注入上下文中运行(比如构造函数内部、提供者工厂函数、TestBed配置场景等),直接实例化时没有这个上下文,导致inject()无法获取依赖。

以下是两种可行的调整方案:

方案一:使用TestBed创建服务实例(推荐)

这是Angular测试的标准做法,TestBed会自动创建注入上下文,让inject()能正常获取依赖:

describe('ResetService', () => {
  let service: ResetService;
  // 注意:原代码中类型写为OrderRepository是笔误,需改为实际依赖ServiceOne
  let serviceOneSpy: jasmine.SpyObj<ServiceOne> = jasmine.createSpyObj('ServiceOne', ['clearOrders']);

  beforeEach(() => {
    // 配置TestBed,提供目标服务和模拟依赖
    TestBed.configureTestingModule({
      providers: [
        ResetService,
        { provide: ServiceOne, useValue: serviceOneSpy }
      ]
    });

    // 从TestBed中获取服务实例,此时inject()可正常执行
    service = TestBed.inject(ResetService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});

方案二:为服务保留构造函数注入的兼容方式

如果不想依赖TestBed,可以给服务添加可选构造函数参数,兼容手动注入逻辑:

// 修改后的服务代码
export class ResetService {
  #serviceOne: ServiceOne;

  constructor(serviceOne?: ServiceOne) {
    this.#serviceOne = serviceOne ?? inject(ServiceOne);
  }
}

这样原测试代码的new ResetService(serviceOneSpy)写法就能正常工作,同时不影响生产环境中inject()的注入逻辑。


内容的提问来源于stack exchange,提问作者user759235

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:30:54