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
相关产品推荐
相关产品推荐

