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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:15:42