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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:50:35