使用Jest模拟Observable时遇报错:subscribe不是函数
问题解决:模拟返回Observable的方法时出现subscribe不存在的错误
你遇到的错误根源很明确:mockResolvedValue是用来模拟返回Promise的方法,但getOverlayMessage实际返回的是RxJS的Observable,Promise没有subscribe方法,所以调用时会报错。
正确的做法是让模拟方法返回一个合法的Observable实例,以下是几种常用方案:
1. 用RxJS的of返回同步Observable
这是最常用的场景,适合模拟立即返回数据的情况:
import { of } from 'rxjs'; // 模拟你的messageService const messageService = { getOverlayMessage: jest.fn().mockReturnValue(of({ /* 这里放你需要的测试数据,比如text: '测试弹窗消息' */ })) };
2. 模拟异步/延迟返回的Observable
如果需要模拟延迟响应的场景,可以结合delay操作符:
import { of } from 'rxjs'; import { delay } from 'rxjs/operators'; messageService.getOverlayMessage = jest.fn().mockReturnValue( of({ text: '延迟弹窗消息' }).pipe(delay(100)) );
3. 模拟错误场景的Observable
如果要测试错误分支,可以用throwError返回一个抛出错误的Observable:
import { throwError } from 'rxjs'; messageService.getOverlayMessage = jest.fn().mockReturnValue( throwError(() => new Error('获取弹窗消息失败')) );
4. 手动创建Observable(了解原理用)
如果需要更自定义的行为,也可以手动实例化Observable:
messageService.getOverlayMessage = jest.fn().mockReturnValue(new Observable(subscriber => { // 发送数据 subscriber.next({ text: '自定义弹窗消息' }); // 完成订阅 subscriber.complete(); }));
核心要点:针对返回Observable的方法,必须用mockReturnValue返回Observable实例,而不是mockResolvedValue(后者仅适用于Promise)。
内容的提问来源于stack exchange,提问作者Maryam Ghafarinia
相关产品推荐
相关产品推荐

