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

如何通过React自定义useJaime钩子测试?解决返回undefined问题

解决自定义React Query钩子测试返回undefined的问题

你的测试失败主要有三个核心问题:没有Mock真实API请求、未处理useQuery的异步状态、断言时机错误。以下是具体修复方案:

1. Mock axios请求,避免调用真实API

测试时不需要发起真实网络请求,用Jest Mock掉axios的get方法,直接返回预设的测试数据:

// 在测试文件顶部添加
jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;

2. 调整测试逻辑,处理异步加载流程

useQuery是异步钩子,初始状态下jaimeRamirez就是undefined,需要等待请求完成(或Mock的响应返回)后再断言。使用waitFor工具来等待状态更新。

3. 优化测试代码(完整示例)

import { renderHook, waitFor } from '@testing-library/react';
import { useJaime } from './your-hook-file';
import axios from 'axios';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;

const infoJaime = {
  nombre: 'Jaime Ramírez',
  compania: 'Microsoft',
  coche: 'Porsche',
};

const createWrapper = () => {
  const queryClient = new QueryClient({
    defaultOptions: {
      queries: {
        retry: false, // 关闭重试,避免测试超时
      },
    },
  });
  return ({ children }) => (
    <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  );
};

describe('Testando hooks customizados: ', () => {
  test('useJaime 应正确返回数据', async () => {
    // Mock axios返回预设数据
    mockedAxios.get.mockResolvedValue({ data: infoJaime });

    const { result } = renderHook(() => useJaime(), {
      wrapper: createWrapper(),
    });

    // 初始状态断言:正在加载,数据为undefined
    expect(result.current.isLoading).toBe(true);
    expect(result.current.jaimeRamirez).toBeUndefined();

    // 等待异步请求完成,断言最终状态
    await waitFor(() => {
      expect(result.current.isLoading).toBe(false);
      expect(result.current.jaimeRamirez).toEqual(infoJaime);
    });
  });
});

关键修复点说明

  • Mock axios:确保测试不依赖真实API,完全用预设数据验证逻辑
  • 关闭重试:React Query默认会重试失败请求,关闭后避免测试超时或不必要的等待
  • waitFor:等待useQuery的异步状态更新,确保数据加载完成后再执行断言
  • 分阶段断言:先验证初始加载状态,再验证最终数据状态,让测试逻辑更清晰

内容的提问来源于stack exchange,提问作者Douglas de Brito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:35:02