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

MockedProvider在组件查询参数变更时无法正常工作的问题

Apollo MockedProvider 变量更新后无数据返回的解决办法

问题根因

你当前的mock只配置了where:7的请求,但组件初始化时会先发起where:5的请求——这个请求找不到对应的mock,会让Apollo客户端进入错误状态,后续哪怕变量更新为7,客户端也没法正常处理新的请求。另外测试里的act只等了一次timeout,没覆盖到查询完成的时机。

具体解决步骤

1. 给所有请求场景加mock

把初始的where:5请求也配上mock,保证每一次请求都有对应的响应:

const mockContractPricing = [
  // 处理初始where=5的请求
  {
    request: {
      query: QUERY_PRODUCTS,
      variables: { where: 5 },
    },
    result: { data: { products: [] } }, // 空数据或者测试用的占位数据都行
  },
  // 处理更新后where=7的请求
  {
    request: {
      query: QUERY_PRODUCTS,
      variables: { where: 7 },
    },
    result: { data: { products: productsData } },
  },
];

2. 用waitFor等待查询完成

测试里别只靠setTimeout等待,改用waitFor来确保查询完成:

import { waitFor } from '@testing-library/react';

describe('dsfgdas', () => {
  it('ggg', async () => {
    const { container } = render(
      <MockedProvider mocks={mockContractPricing} addTypename={false}>
        <TestComp />
      </MockedProvider>
    );

    // 等待查询完成,这里可以加具体的断言,比如组件渲染了产品数据
    await waitFor(() => {
      // 示例:expect(container.querySelector('.product-item')).toBeInTheDocument();
    });

    console.log(container.innerHTML);
  });
});

3. 确认组件内查询配置(可选)

你的组件里用useMemo生成where,依赖testValue,这部分没问题,变量变化时会触发useQuery重新发起请求,不用额外调整。

核心要点

Apollo的MockedProvider是严格匹配请求的query和variables的,任何一次无匹配的请求都会让客户端进入异常状态,必须给所有可能的请求都配置对应的mock,同时测试要等待新的查询完成才能拿到正确数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:12:26