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

测试用例间如何清除Apollo缓存?React Testing Library+Jest环境问题

问题根因

你在所有测试用例中复用了同一个全局cache实例传递给MockedProvider,第一个用例执行后产生的缓存数据会被后续所有用例直接读取,不会触发新的请求,也就不会出现加载状态,同时前序用例的hasNextPage缓存值也会直接被复用,导致第二个用例的mock配置不生效。

解决方案

方案1:每个用例单独创建缓存实例(最推荐)

不要在外层定义公共的cache变量,每个测试用例内部单独实例化InMemoryCache再传给MockedProvider,从根源上隔离不同用例的缓存:

import { InMemoryCache } from '@apollo/client';

it('shows a "show more" button when there is `hasNextPage` is true', async () => {
  const cache = new InMemoryCache(); // 每个用例单独实例化缓存
  render(
    <MemoryRouter initialEntries={['/media/1']}>
      <MockedProvider mocks={[getCharacterMock, getMediaMock]} cache={cache}>
        <Route path='/media/:id'>
          <Media />
        </Route>
      </MockedProvider>
    </MemoryRouter>
  );
  // 其余测试逻辑保持不变
});

it("doesn't show a 'show more' button when `hasNextPage` is false", async () => {
  const cache = new InMemoryCache(); // 每个用例单独实例化缓存
  render(
    <MemoryRouter initialEntries={['/media/1']}>
      <MockedProvider mocks={[getCharacterMockNextPageFalse, getMediaMock]} cache={cache}>
        <Route path='/media/:id'>
          <Media />
        </Route>
      </MockedProvider>
    </MemoryRouter>
  );
  // 其余测试逻辑保持不变
});

方案2:不显式传递cache参数

MockedProvider 默认会为每个实例自动创建独立的缓存,如果你没有特殊的自定义缓存配置需求,直接去掉cache属性即可,无需手动管理缓存实例:

<MockedProvider mocks={[getCharacterMock, getMediaMock]}>
  <Route path='/media/:id'>
    <Media />
  </Route>
</MockedProvider>

方案3:复用缓存则每次用例结束后清空

如果你确实需要复用同一个缓存实例,可以在afterEach钩子中调用缓存的reset方法清空所有历史数据:

import { InMemoryCache } from '@apollo/client';

const cache = new InMemoryCache();

afterEach(() => {
  cache.reset();
});

// 后续测试用例代码保持不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:57:03