Redux Toolkit测试调用store.dispatch触发无限循环导致超时如何解决?
问题根因
你遇到的超时不是无限循环导致的,问题出在测试用例的异步通知逻辑:
- 你声明了测试用例接收
done回调,但异步逻辑执行完成后没有主动调用done(),jest会一直等待测试结束信号,直到超时阈值触发报错。 - 没有捕获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,提问作者김진영
相关产品推荐
相关产品推荐

