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

使用MockedProvider测试Apollo查询组件时遇client上下文缺失错误求助

解决MockedProvider测试时"Could not find 'client' in context"错误

以下是几种排查和解决方法:

  • 等待异步查询完成
    MockedProvider处理GraphQL查询是异步的,直接同步断言会导致组件还未获取到上下文client就渲染,引发错误。使用测试库的waitFor或act等待异步操作完成:

    import { render, waitFor } from '@testing-library/react';
    import { MockedProvider } from '@apollo/client/testing';
    import MyWrapper from './MyWrapper';
    
    test('组件渲染正常', async () => {
      const mocks = [/* 你的Mock配置 */];
      const { getByTestId } = render(
        <MockedProvider mocks={mocks}>
          <MyWrapper />
        </MockedProvider>
      );
    
      await waitFor(() => {
        expect(getByTestId('data-container')).toBeInTheDocument();
      });
    });
    
  • 校验Mock格式正确性
    确保每个Mock对象包含request(指定查询和变量)和result(返回数据)字段,格式错误会导致MockedProvider无法正确初始化client:

    const mocks = [
      {
        request: {
          query: YOUR_GRAPHQL_QUERY,
          variables: { id: '123' } // 对应查询的变量(如果有)
        },
        result: {
          data: {
            // 匹配查询结构的返回数据
            item: { id: '123', name: 'Test Item' }
          }
        }
      }
    ];
    
  • 显式传递ApolloClient实例
    若MyWrapper或其子组件对client有直接依赖,可显式创建client并传递给MockedProvider:

    import { ApolloClient, InMemoryCache } from '@apollo/client';
    import { MockedProvider } from '@apollo/client/testing';
    
    const testClient = new ApolloClient({
      cache: new InMemoryCache(),
      uri: 'https://test.example.com/graphql' // 测试环境地址,可填任意值
    });
    
    render(
      <MockedProvider mocks={mocks} client={testClient}>
        <MyWrapper />
      </MockedProvider>
    );
    
  • 移除不必要的ApolloProvider嵌套
    检查MyWrapper内部或子组件是否自行包裹了ApolloProvider,这会覆盖MockedProvider的上下文,导致client找不到。测试时需移除这类嵌套的Provider。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:10:32