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

Jest测试中useQuery Hook返回undefined的问题求助

解决React Query useQuery在Jest测试中返回undefined的问题

你已经正确mock了UserApi但useQuery仍返回undefined,核心问题在于测试环境中React Query的QueryClient未正确初始化,或是你没有等待异步请求完成。下面是分步解决方案:

1. 给测试配置QueryClientProvider

React Query依赖QueryClient管理查询状态与缓存,测试环境中必须提供这个上下文才能让useQuery正常工作。你需要在渲染组件时包裹QueryClientProvider,并创建一个测试专用的QueryClient(禁用重试等不必要的配置):

// 在测试文件或root-render配置中添加
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

// 创建测试用QueryClient,禁用重试避免测试超时
const testQueryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retry: false,
      refetchOnWindowFocus: false,
      refetchOnMount: false,
    },
  },
});

// 封装带QueryClient的渲染函数
const renderWithQuery = (ui) => {
  return render(
    <QueryClientProvider client={testQueryClient}>
      {ui}
    </QueryClientProvider>
  );
};

// 修改mockAndRender方法,使用新的渲染函数
function mockAndRender(userFiles, userStatus, userSecondaryStatus) {
  useCurrentUserInfo.mockReturnValue([{}]);
  mockApi(userFiles, userStatus, userSecondaryStatus);
  renderWithQuery(<UserDetails />);
}

2. 等待异步请求完成再做断言

useQuery是异步执行的,渲染后立刻断言的话,请求还处于pending状态,data自然是undefined。你需要用Testing Library的异步查询方法(如waitFor、findBy*)等待请求完成:

describe('<UserDetails />', () => {
  it('should render user data correctly', async () => {
    mockAndRender([1], 'Awarded', null);
    
    // 等待页面上依赖user数据的元素加载完成(比如显示userStatus的文本)
    const userStatusElement = await screen.findByText('Awarded');
    expect(userStatusElement).toBeInTheDocument();
    
    // 验证API调用是否符合预期
    expect(UserApi.getUserById).toHaveBeenCalledTimes(1);
    expect(UserApi.getUserById).toHaveBeenCalledWith('userId');
  });
});

3. 验证mock API的返回格式

你的mock API返回{ data: {...} },组件中useQuery也通过.then(({ data }) => data)提取了内层数据,格式是匹配的。只需确保mock的Promise是resolve状态,不要误写成reject即可。

4. 可选:重置QueryClient避免测试污染

如果有多个测试用例,建议在每个测试前重置QueryClient与mock,避免缓存或残留状态影响结果:

beforeEach(() => {
  testQueryClient.clear();
  jest.clearAllMocks();
});

完成以上步骤后,useQuery就能正确接收mock API返回的数据,不会再返回undefined了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:45:38