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

Apollo Client测试时Mock变量未生效,调用参数与预期不符如何解决?

Apollo Client 单元测试变量不符合预期问题修复方案
  • 澄清useQuery返回variables的含义
    useQuery返回的variables字段是你调用useQuery时主动传入的请求参数,和Mock配置无关。Mock配置的变量只是用来匹配请求、决定是否返回对应Mock数据的匹配条件,不会修改你组件内传入的参数值。只要你命中Mock拿到了预期的statusData,就是正常的,不需要要求variables和Mock里的配置一致。
  • 修正Mock变量与实际请求的匹配关系
    你的useStatus自定义Hook中硬编码了请求变量:statusInput: { id: someId, numValue: 1 },但你配置的Mock中变量为statusInput: { id: '1234', numValue: 55 }。Apollo MockedProvider要求请求的查询语句、变量必须和Mock配置完全一致才会命中Mock返回,你需要将Mock配置的变量和实际请求参数对齐:
    const mocks = [
      {
          request: {
              query: getStatus,
              variables: {
                  statusInput: {
                      id: '1234',
                      numValue: 1, // 修正为和实际请求一致的1
                  },
              },
          },
          // 其余配置不变
      }
    ]
    
  • Mock useId 钩子的返回值
    你代码中id取值来自React内置的useId钩子,测试环境下该钩子默认返回随机值/空值,不会返回你预期的'1234',需要在测试文件顶部Mock该钩子:
    jest.mock('react', () => ({
      ...jest.requireActual('react'),
      useId: () => ['1234']
    }))
    
  • 检查skip触发条件
    你的useQuery配置了skip: !cartId,如果测试环境中cartId为空,会直接跳过查询,不会发起请求,变量也会停留在初始值。需要确认你的测试上下文mockedContextData中已经正确注入了非空的cartId值。
  • 修正返回数据的类型字段名
    你开启了addTypename={true},但Mock返回数据中写的是__type: 'StatusResponse',正确的类型字段名为__typename,修正后才能被Apollo正常解析:
    result: {
      data: {
          getStatus: {
              __typename: 'StatusResponse', // 修正字段名
              canAccess: true,
              isCorrect: true
          },
      }
    }
    
  • 检查变量命名错误
    你打印的变量中key为checkoutStatusInput,和你定义的查询变量名statusInput不符,优先检查是否在代码中写错了变量名,或者打印了其他查询的变量值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:27:06