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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:10:57