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

React-Testing Library与MSW v2测试RTKQ时renderHook无数据返回

RTKQ请求isSuccess为true但data未定义的排查与解决

可能的原因及排查步骤

1. 检查Redux Store是否正确配置RTKQ

RTKQ需要将其reducer添加到store中,并启用对应的middleware,否则无法正确缓存和返回响应数据。确认你的store配置包含以下核心内容:

import { configureStore } from '@reduxjs/toolkit';
import { adminApi } from './path-to-adminApi';

export const store = configureStore({
  reducer: {
    // 必须注册RTKQ的reducer
    [adminApi.reducerPath]: adminApi.reducer,
  },
  middleware: (getDefaultMiddleware) =>
    // 必须添加RTKQ的middleware以处理请求生命周期
    getDefaultMiddleware().concat(adminApi.middleware),
});

如果缺少这部分配置,RTKQ无法正确处理响应数据,可能出现isSuccess: true但data未定义的异常。

2. 验证MSW请求路径是否与实际请求匹配

虽然你的MSW handler路径看起来正确,但实际请求的URL可能因BASE_URL拼接细节(如斜杠、域名后缀)不匹配。可以通过以下方式确认:

  • 在MSW handler中添加日志,确认是否被触发:
    http.get(`${BASE_URL}/admin/test`, () => {
      console.log('MSW test handler triggered'); // 检查控制台是否打印此信息
      return HttpResponse.json({ data: 'Hello World' });
    }),
    
  • 在测试中监听fetch,查看实际请求的完整URL:
    // 测试文件顶部
    global.fetch = jest.spyOn(global, 'fetch').mockImplementation(global.fetch);
    
    // 测试用例中
    await waitFor(() => expect(result.current.isSuccess).toBe(true));
    console.log('实际请求URL:', global.fetch.mock.calls[0][0]);
    

对比实际请求URL与MSW handler的路径,确保完全一致(注意斜杠、端口、环境变量取值等细节)。

3. 调整测试中的断言时机

虽然isSuccess变为true理论上意味着data已就绪,但可以直接等待data被定义,避免状态更新的时序问题:

test('renders hook', async () => {
    const { result } = renderHook(() => useTestQuery(), {
        wrapper,
    });

    // 直接等待data被定义,替代先判断isSuccess的逻辑
    await waitFor(() => expect(result.current.data).toBeDefined());

    console.log('数据已获取:', result.current.data);
    expect(result.current.data.data).toBe('Hello World');
});

4. 确认RTKQ endpoint的method配置

检查httpMethod.Get的值是否为'GET'(大写),虽然HTTP方法通常不区分大小写,但确保与MSW的http.get匹配(MSW的http.get仅匹配GET方法的请求)。如果httpMethod.Get是小写的'get',可以改为大写,或者直接写method: 'GET'。

5. 检查MSW响应的正确性

确保MSW返回的响应是有效的200状态码(默认是200),并且JSON结构与Test接口完全匹配。可以显式指定状态码以排除异常:

return HttpResponse.json({ data: 'Hello World' }, { status: 200 });

总结

最常见的问题是Store未正确配置RTKQ的reducer和middleware,或者MSW请求路径与实际请求不匹配。按照上述步骤逐一排查,应该能解决isSuccess: true但data未定义的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:55:07