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
相关产品推荐
相关产品推荐

