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

如何使用Jasmine为TestService SpyObj创建subscribe和getTestData间谍?

在Jasmine中给TestService创建subscribe()和getTestData()方法的间谍

嗨Mike,我来帮你搞定这个问题!在Jasmine里给TestService的这两个方法创建间谍其实很直观,主要有两种常用方式,你可以根据自己的场景来选:


1. 直接创建包含目标方法的SpyObj

这是最常用的方式,在创建SpyObj的时候直接指定需要模拟的方法列表:

// 创建TestService的SpyObj,同时定义getTestData和subscribe为间谍方法
const testServiceSpy = jasmine.createSpyObj('TestService', ['getTestData', 'subscribe']);

创建完成后,你还可以给这些间谍方法设置自定义行为,比如让getTestData返回一个模拟的Observable(如果它原本就返回Observable的话):

// 假设你用RxJS,先导入of操作符
import { of } from 'rxjs';

// 给getTestData设置返回值:包含模拟测试数据的Observable
testServiceSpy.getTestData.and.returnValue(of({ id: 1, content: '模拟测试数据' }));

// 如果需要给subscribe方法设置行为,比如模拟回调触发
testServiceSpy.subscribe.and.callFake((nextCallback) => {
  nextCallback('模拟订阅返回的数据');
});

2. 给已有的SpyObj添加方法间谍

如果你已经有一个TestService的SpyObj实例,想要后续给它添加这两个方法的间谍,可以用jasmine.createSpy()来单独创建:

// 假设你已经有了一个已存在的testServiceSpy
testServiceSpy.getTestData = jasmine.createSpy('getTestData').and.returnValue(of({}));
testServiceSpy.subscribe = jasmine.createSpy('subscribe').and.callFake((cb) => cb({}));

额外说明:关于Observable的subscribe

如果subscribe并不是TestService本身的方法,而是getTestData返回的Observable上的方法,那你不需要给TestService单独加subscribe间谍。你可以让getTestData返回一个带有间谍subscribe的Observable,或者直接用RxJS的of创建模拟Observable,再监听它的subscribe调用:

const mockData$ = of({ data: '测试内容' });
// 给这个Observable的subscribe方法创建间谍
spyOn(mockData$, 'subscribe');

testServiceSpy.getTestData.and.returnValue(mockData$);

// 后续可以断言subscribe是否被调用
expect(mockData$.subscribe).toHaveBeenCalled();

这样就能轻松完成你需要的间谍设置啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:14:20