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

React中使用Jest测试redux异步action getUserData运行失败如何解决

React 异步thunk action 测试解决方案

测试失败核心原因

  • getUserData 是异步thunk高阶函数,调用后首先返回的是接收dispatch、getState参数的函数,最终执行结果是Promise对象,原用例同步执行断言拿到的是Pending状态的Promise,无法匹配预期值
  • 原用例调用getUserData时没有传入thunk必须的dispatch、getState参数,内部的dispatch逻辑无法正常执行
  • 异步测试用例没有添加等待逻辑,jest会在异步逻辑执行完成前就结束用例,无法拿到正确执行结果

修正后测试用例

import { getUserData, GET_USER } from "../userReducers";

// 全局mock fetch接口
global.fetch = jest.fn(() =>
  Promise.resolve({
    json: () => ({ login: 'Someone' })
  })
)

describe("Testing user reducers", () => {
  // 每个用例执行前清空mock调用记录,避免用例间互相污染
  beforeEach(() => {
    fetch.mockClear();
  })

  it("will hit mock API and get response", async () => {
    // mock thunk需要的dispatch和getState参数
    const mockDispatch = jest.fn();
    const mockGetState = jest.fn();

    // 调用thunk函数,加上await等待异步逻辑全部执行完成
    const response = await getUserData('Someone')(mockDispatch, mockGetState);

    // 断言fetch调用路径符合预期
    expect(fetch).toHaveBeenCalledWith(`${process.env.REACT_APP_API_URL}/users/Someone`);
    // 断言接口返回值符合预期
    expect(response).toEqual({ login: 'Someone' });
    // 断言dispatch触发了正确的action
    expect(mockDispatch).toHaveBeenCalledWith({
      type: GET_USER,
      payload: { login: 'Someone' }
    })
  })
})

内容的提问来源于stack exchange,提问作者Lelianto Pradana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:48:05