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

React测试GraphQL查询报错:TypeError: (0 , _client.gql) is not a function

解决Jest测试中Apollo Client gql 不是函数的问题

核心原因

CRA默认的Jest配置没正确处理Apollo Client的ES模块导出,或者测试环境里gql函数的导出未被正确模拟。

可行解决方案

1. 统一gql的导入路径

确保业务代码和测试文件里的gql都从@apollo/client导入,别混用旧版的apollo-boost或其他路径:

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

2. 手动模拟gql函数

单个测试文件内模拟

在测试文件顶部添加模拟逻辑:

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

// 保留Apollo Client其他原有导出,仅替换gql为模拟函数
jest.mock('@apollo/client', () => ({
  ...jest.requireActual('@apollo/client'),
  gql: jest.fn((query) => query),
}));

// 你的测试用例
describe('useFetchPlayers', () => {
  // 编写测试逻辑
});

全局模拟(一次配置所有测试生效)

在项目根目录新建__mocks__/@apollo/client.js文件,写入以下内容:

const actual = jest.requireActual('@apollo/client');

module.exports = {
  ...actual,
  gql: jest.fn((query) => query),
};

3. 适配gql模板字符串特性

如果你的查询用了模板字符串语法,调整模拟逻辑以支持该特性:

gql: jest.fn().mockImplementation((literals, ...placeholders) => {
  return literals.reduce((acc, val, i) => acc + val + (placeholders[i] || ''), '');
});

4. 给测试hook配置Apollo Provider

测试自定义hook时,必须用ApolloProvider包裹,并传入测试用的客户端实例:

import { renderHook } from '@testing-library/react';
import { ApolloProvider, ApolloClient, InMemoryCache } from '@apollo/client';

// 创建测试用客户端
const testClient = new ApolloClient({
  uri: 'https://test.example.com/graphql',
  cache: new InMemoryCache(),
});

// 封装Provider作为测试包裹器
const wrapper = ({ children }) => (
  <ApolloProvider client={testClient}>{children}</ApolloProvider>
);

// 执行hook测试
test('useFetchPlayers能正常获取数据', () => {
  const { result } = renderHook(() => useFetchPlayers(), { wrapper });
  // 编写断言逻辑
});

5. 清除Jest缓存

缓存可能导致模块导出异常,执行命令清除:

npm test -- --clearCache

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:57:12