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

