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

Jasmine SpyObj方法undefined问题:Angular单元测试服务Mock配置错误排查

问题原因及修正方案
  • 核心配置错误:Provider的useValue多嵌套了一层对象
    你在providers配置中写的useValue: {applicationsServiceSpy}是ES6对象简写语法,等价于useValue: { applicationsServiceSpy: applicationServiceSpy }。这就导致注入到组件的ApplicationsService实例是这个外层包装对象,getApplications方法实际存在于外层对象的applicationsServiceSpy属性下,自然无法直接通过this.applicationsService.getApplications调用,这也是你打印整个mock对象能看到方法、但直接访问方法返回undefined的直接原因。
    修正方式:直接将useValue赋值为applicationServiceSpy本身,不要外层的大括号。

  • 多处语法笔误

  1. jasmine.createSpyObj的第一个参数字符串缺少闭合单引号,原代码写为'ApplicationService,正确应为'ApplicationService'
  2. TestBed.configureTestingModule的组件配置属性应为复数declarations,你写成了单数declaration,会导致组件声明失效
  3. 多个代码块缺少闭合的括号/花括号:第一个waitForAsync的回调、第一个beforeEach、整个describe块都缺少对应的闭合符号
修正后的完整测试代码
describe('DashboardComponent', () => {
  let mockApplicationsService: jasmine.SpyObj<ApplicationsService>;
  // 修正:补全字符串闭合引号
  const applicationServiceSpy = jasmine.createSpyObj('ApplicationService', ['getApplications']);
  
  beforeEach(
    waitForAsync(() => {
      TestBed.configureTestingModule({
        // 修正:改为复数declarations
        declarations: [DashboardComponent],
        providers: [
          {
            provide: ApplicationsService,
            // 修正:去掉外层对象包装,直接传入spy实例
            useValue: applicationServiceSpy
          }
        ]
      }).compileComponents();
    // 修正:补全waitForAsync和beforeEach的闭合括号
    })
  );

  beforeEach(() => {
    mockApplicationsService = TestBed.inject(ApplicationsService) as jasmine.SpyObj<ApplicationsService>;
    fixture = TestBed.createComponent(DashboardComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create the app', () => {
    console.log(mockApplicationsService);
    console.log(mockApplicationsService.getApplications);
    expect(component).toBeTruthy();
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:48:03