如何使用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
相关产品推荐
相关产品推荐

