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

Redux-observable 使用Marbles测试无返回值问题求助

问题解决思路

以下是导致测试无预期返回的常见原因和对应修复方案:

  • 调度器不匹配导致异步时序异常
    TestScheduler的虚拟时钟仅能管控RxJS内部调度的异步任务,你当前代码中API.graphql返回的是原生Promise,属于JS引擎层面的微任务,不受TestScheduler控制。测试执行时Promise还没resolve,TestScheduler就已经完成断言,因此拿到空的返回结果。
    修复方案:把mock的API.graphql返回值改成走TestScheduler调度的Cold Observable,替换原有Promise:
    // 原来的mock
    // (API.graphql as jest.Mock).mockImplementation(() => Promise.resolve({
    //   data: { listAllUsers: { users: mockFetchedUsers } },
    // }));
    // 修改为
    (API.graphql as jest.Mock).mockImplementation(() => 
      testScheduler.createColdObservable('a|', {
        a: { data: { listAllUsers: { users: mockFetchedUsers } } }
      })
    );
    
  • action type不匹配被过滤
    确认你调用fetchUsers()返回的action对象的type字段值,和epic中ofType(FETCH_USERS)里的FETCH_USERS常量完全一致,如果不一致会被ofType操作符过滤,后续逻辑完全不会执行,自然无返回。
  • 导入错误导致epic未正确执行
    你原epic代码的函数名为fetchUsersApi,测试代码中是import fetchUsersEpic from './fetchUsersApi',要确认源文件是将fetchUsersApi作为默认导出,如果你是命名导出的写法export const fetchUsersApi = xxx,则导入语句应该改为import { fetchUsersApi as fetchUsersEpic } from './fetchUsersApi'。
  • 运行时报错走到catchError分支
    你代码中用了pathOr工具函数,首先确认该函数已正确导入,如果导入失败会抛出异常,被catchError捕获后返回的是错误相关的action,和你预期的fetchUsersSuccess不匹配。可以在catchError中加日志,确认测试时是否走到了错误分支。
  • 冗余flush调用影响时序
    testScheduler.run回调执行完毕后会自动触发flush,不需要手动调用flush(),冗余调用可能会打乱时序判断,删除该行即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:54:02