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

Angular Jasmine测试报错:Cannot read properties of undefined reading 'subscribe'求助

解决Angular Jasmine测试中调用ngOnInit时的"Cannot read properties of undefined"错误

你的问题根源是组件的userService依赖未在测试环境中正确初始化,导致调用this.userService.getUser()时触发undefined错误。以下是两种可行的修复方案:

方案1:手动初始化组件的userService属性

在测试用例中,直接给组件实例的userService赋值你创建的spy对象:

// 提前创建UserService的spy对象
const userServiceSpy = jasmine.createSpyObj('UserService', ['getUser']);

it('should call getUserTwo when ngOnInit runs', () => {
  userServiceSpy.getUser.and.returnValue(of({}));
  // 给组件的userService属性赋值,避免undefined
  component.userService = userServiceSpy;
  
  const spygetUserTwo = spyOn(component, 'getUserTwo').and.callThrough();
  component.ngOnInit();
  
  expect(spygetUserTwo).toHaveBeenCalled();
});

方案2:通过TestBed配置测试模块注入Mock服务

更规范的做法是在测试套件的初始化阶段,通过TestBed配置将Mock服务注入组件:

describe('YourComponent', () => {
  let component: YourComponent;
  let userServiceSpy: jasmine.SpyObj<UserService>;

  beforeEach(async () => {
    // 创建UserService的spy实例
    userServiceSpy = jasmine.createSpyObj('UserService', ['getUser']);

    await TestBed.configureTestingModule({
      declarations: [YourComponent],
      providers: [
        { provide: UserService, useValue: userServiceSpy }
      ]
    }).compileComponents();
  });

  beforeEach(() => {
    const fixture = TestBed.createComponent(YourComponent);
    component = fixture.componentInstance;
    // 此时component.userService已被TestBed自动注入为spy对象
  });

  it('should call getUserTwo when ngOnInit runs', () => {
    userServiceSpy.getUser.and.returnValue(of({}));
    const spygetUserTwo = spyOn(component, 'getUserTwo').and.callThrough();
    
    component.ngOnInit();
    
    expect(spygetUserTwo).toHaveBeenCalled();
    // 可额外验证userService的getUser方法是否被调用
    expect(userServiceSpy.getUser).toHaveBeenCalled();
  });
});

关键注意点

  • 两种方案的核心都是确保组件的userService属性在调用ngOnInit前已被赋值为有效实例(Spy或Mock),避免undefined。
  • 若组件通过构造函数注入UserService,必须保证测试环境中提供了对应的依赖实例,否则会触发依赖注入失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:30:56