Angular测试中ConsultationDataService实例为undefined问题排查
Angular测试中Service实例为undefined的问题修复
你的问题出在依赖注入配置错误:用useClass提供jasmine间谍对象是错误的,因为jasmine.createSpyObj创建的是一个实例对象,而useClass要求传入可实例化的类,TestBed无法用实例去创建新的依赖实例,导致依赖CallsClient的ConsultationDataService无法正确初始化,最终service变量变成undefined。
修正方法
把{ provide: CallsClient, useClass: spy }改成{ provide: CallsClient, useValue: spy },直接将创建好的间谍实例注入。
修正后的完整测试代码
import { TestBed } from '@angular/core/testing'; import { CallsClient, CallVm } from './web-api-client'; import { ConsultationDataService } from './consultation-data.service'; import { Observable, of } from 'rxjs'; describe('ConsultationDataService', () => { let service: ConsultationDataService; let callsClientSpy: jasmine.SpyObj<CallsClient>; beforeEach(() => { const spy = jasmine.createSpyObj('CallsClient', ['get']); spy.get.and.returnValue(of(new CallVm())); TestBed.configureTestingModule({ providers: [ ConsultationDataService, { provide: CallsClient, useValue: spy } // 此处替换为useValue ] }) service = TestBed.inject(ConsultationDataService); callsClientSpy = TestBed.inject(CallsClient) as jasmine.SpyObj<CallsClient>; }); it('should be created', () => { expect(service).toBeTruthy(); }); });
补充说明
如果需要模拟类的构造逻辑,才需要用jasmine.createSpy创建类间谍,但你的场景里直接用实例间谍+useValue就足够解决问题。
内容的提问来源于stack exchange,提问作者iasksillyquestions
相关产品推荐
相关产品推荐

