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
相关产品推荐
相关产品推荐

