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

Redux Toolkit测试调用store.dispatch触发无限循环导致超时如何解决?

问题根因

你遇到的超时不是无限循环导致的,问题出在测试用例的异步通知逻辑:

  1. 你声明了测试用例接收done回调,但异步逻辑执行完成后没有主动调用done(),jest会一直等待测试结束信号,直到超时阈值触发报错。
  2. 没有捕获Promise的异常,就算断言执行失败,错误也会被Promise吞掉,jest无法收到异常通知,同样会进入等待超时的逻辑。
    你在builder.addCase里能打印出正确的状态,说明异步action、接口mock、reducer的逻辑都是正常的,不需要调整业务代码。

解决方法

以下三种写法都可以,按你的习惯选即可:

写法1:async/await(最推荐,可读性最高)

不需要用done,直接用async/await等待异步dispatch执行完成即可:

it("Should fetch repositories correctly", async () => {
    const repository : IRepository = repositoryFactory();
    mockedAPIs.getRepositories.mockResolvedValue([repository]);
    await store.dispatch(fetchRepositories(""));
    expect(store.getState().repos.repoList.length).toBe(1);
});

写法2:直接返回Promise

不使用async语法的话,直接把dispatch返回的Promise return出去,jest会自动等待Promise完成:

it("Should fetch repositories correctly", () => {
    const repository : IRepository = repositoryFactory();
    mockedAPIs.getRepositories.mockResolvedValue([repository]);
    return store.dispatch(fetchRepositories("")).then(() => {
        expect(store.getState().repos.repoList.length).toBe(1);
    });
});

写法3:保留done回调

如果你要继续用done的写法,记得在成功分支调用done(),同时在catch分支把错误传给done,避免异常被吞:

it("Should fetch repositories correctly", (done) => {
    const repository : IRepository = repositoryFactory();
    mockedAPIs.getRepositories.mockResolvedValue([repository]);
    store.dispatch(fetchRepositories("")).then(() => {
        expect(store.getState().repos.repoList.length).toBe(1);
        done();
    }).catch(done);
});

内容的提问来源于stack exchange,提问作者김진영

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:27:02