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

Jest测试中client.query已执行但未被检测到调用的原因

问题原因及解决办法

核心原因

你当前的useApolloClient mock写法存在关键问题:每次调用useApolloClient()都会返回一个全新的对象,这个对象里的query是新创建的jest.fn()实例。业务代码里拿到的client.query和测试代码里useApolloClient().query根本不是同一个函数,所以测试统计调用次数时自然显示0,哪怕实际已经执行过。

解决步骤

  1. 提前定义共享的query mock函数
    把query的mock函数单独提出来,让所有useApolloClient返回的对象都复用同一个函数实例:

    // 先定义共享的query mock
    const mockQuery = jest.fn().mockResolvedValueOnce({
      data: { myReturnValue: { some: "data" } },
      loading: false,
      errors: undefined,
    })
    
    jest.mock("@apollo/client", () => ({
      ...jest.requireActual("@apollo/client"),
      useApolloClient: () => ({
        query: mockQuery, // 复用同一个mock函数
      }),
    }))
    
  2. 修改测试断言
    直接用提前定义好的mockQuery做断言,不要再调用useApolloClient()取新的函数:

    fireEvent.click(screen.getByText("My Button Text"))
    await waitFor(() => expect(mockQuery).toBeCalledTimes(1))
    

这样就能正确统计到query函数的调用次数了,因为业务代码和测试代码用的是同一个mock函数实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:32:35