使用Redux Toolkit createAsyncThunk单元测试报错:Promise.race不是函数
问题分析与解决
使用Redux Toolkit的createAsyncThunk实现数据获取逻辑,浏览器运行正常,但单元测试中分发该thunk时,Promise以rejected action类型解析,抛出错误Promise.race is not a function。
相关代码
异步Thunk代码
import { createAsyncThunk } from '@reduxjs/toolkit'; import axios from 'axios'; const myFunc = createAsyncThunk('returns ID', async (nameAndEmail) => { const response = await axios.post('/backendroute', nameAndEmail); return response.data.id; }); export { myFunc };
单元测试代码
import { myFunc } from './thunk'; import { configureStore } from '@reduxjs/toolkit'; import axios from 'axios'; describe('67087596', () => { it('should pass', async () => { const nameAndEmail = { name: 'John Smith', email: '123@123.com', }; const postSpy = jest.spyOn(axios, 'post').mockResolvedValueOnce({ data: { id: '1' } }); const store = configureStore({ reducer: function (state = '', action) { switch (action.type) { case 'returns ID/fulfilled': return action.payload; default: return state; } }, }); await store.dispatch(myFunc(nameAndEmail)); expect(postSpy).toBeCalledWith('/backendroute', nameAndEmail); const state = store.getState(); expect(state).toEqual('1'); }); });
问题原因
Redux Toolkit内部依赖Promise.race处理异步thunk的取消逻辑,若测试环境(如Jest运行环境)中Promise对象缺失race方法,就会触发该错误。常见于旧版本Node环境、自定义Promise polyfill不完整,或是有代码意外修改了Promise原型。
解决方案
1. 手动补充Promise.race polyfill
在测试文件最顶部添加代码,补全缺失的race方法:
if (!Promise.race) { Promise.race = function(promises) { return new Promise((resolve, reject) => { promises.forEach(promise => { promise.then(resolve, reject); }); }); }; }
2. 使用core-js进行标准polyfill
安装core-js后,在测试文件或Jest全局配置中引入对应polyfill:
import 'core-js/es/promise/race';
3. 升级依赖与环境
- 确保Node版本在v0.12.0以上(该版本原生支持
Promise.race) - 升级Jest及相关测试依赖到最新稳定版,避免环境兼容问题
4. 检查原型污染
排查项目中是否有代码修改了Promise原型,导致race方法被覆盖或删除,恢复Promise的原生实现。
内容的提问来源于stack exchange,提问作者Jahanzaib Jb
相关产品推荐
相关产品推荐

