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

Angular单元测试中如何监视服务构造函数中的嵌套方法

测试Angular服务时监视嵌套对象方法的方案

要在测试MyService时监视SecondService.someObj.someMethod,可以按以下步骤操作:

  • 准备模拟的SecondService
    在测试模块中提供模拟的SecondService替代真实实例,这个模拟服务需要包含someObj属性,后续会在该属性上挂载方法间谍。

  • 创建并挂载方法间谍
    用测试框架(如Jasmine)的createSpy()创建间谍函数,将其赋值给模拟服务的someObj.someMethod,以此捕获该方法的调用行为。

  • 实例化服务并验证调用
    注入模拟的SecondService后实例化MyService,之后就能验证someMethod是否被正确调用。

完整测试代码示例

import { TestBed } from '@angular/core/testing';
import { MyService } from './my.service';
import { SecondService } from './second.service';

describe('MyService', () => {
  let myService: MyService;
  let mockSecondService: jasmine.SpyObj<SecondService>;

  beforeEach(() => {
    // 创建包含someMethod间谍的模拟对象
    const mockSomeObj = {
      someMethod: jasmine.createSpy('someMethod')
    };

    // 创建SecondService模拟实例,挂载mockSomeObj属性
    mockSecondService = jasmine.createSpyObj('SecondService', [], {
      someObj: mockSomeObj
    });

    TestBed.configureTestingModule({
      providers: [
        MyService,
        { provide: SecondService, useValue: mockSecondService }
      ]
    });

    myService = TestBed.inject(MyService);
  });

  it('should call someMethod on SecondService.someObj during initialization', () => {
    // 验证方法是否被调用
    expect(mockSecondService.someObj.someMethod).toHaveBeenCalled();
    // 也可验证调用次数、传入参数等
    // expect(mockSecondService.someObj.someMethod).toHaveBeenCalledTimes(1);
  });
});

关键说明

  • 使用jasmine.createSpyObj的第三个参数(属性配置对象)来设置someObj,因为它是服务的属性而非方法。
  • 间谍创建后,可通过toHaveBeenCalled()、toHaveBeenCalledWith()等匹配器验证调用细节,也能用and.returnValue()模拟方法返回值。

内容的提问来源于stack exchange,提问作者Ricky Mo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:39:52