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

如何使用graphql-request测试Apollo Server Express应用?

使用graphql-request替代supertest-graphql测试Apollo Server应用

要在单元测试里用graphql-request替换supertest-graphql,核心是让测试环境里的Apollo Server Express实例启动一个可访问的HTTP服务,然后用graphql-request直接向这个服务的GraphQL端点发送请求即可。

步骤1:安装依赖

确保已经安装graphql-request:

npm install graphql-request --save-dev

步骤2:修改测试代码

调整测试逻辑,先启动Express服务器,再用graphql-request发送查询:

import { request } from 'graphql-request';
import { gql } from 'graphql-tag';
import app from '../path-to-your-app'; // 导入你的Express应用实例

let server;
let TEST_GRAPHQL_URL;

// 测试前启动服务器
beforeAll(async () => {
  // 用0让系统分配随机可用端口,避免端口冲突
  server = await app.listen(0);
  const address = server.address() as import('net').AddressInfo;
  TEST_GRAPHQL_URL = `http://localhost:${address.port}/graphql`;
});

// 测试后关闭服务器
afterAll(async () => {
  await server.close();
});

it('Query a quote', async () => {
  const id = '123456';
  const query = gql`
    query ($id: String!) {
      word(id: $id) {
        id
      }
      words {
        id
      }
    }
  `;

  // 使用graphql-request发送请求
  const response = await request(TEST_GRAPHQL_URL, query, { id });

  console.log(response);
  expect(response.word.id).toBe('123456');
});

关键说明

  • 用随机端口启动服务器可以避免本地开发时的端口占用问题,如果你偏好固定端口,直接替换0为指定端口(比如4000)即可。
  • 如果你的Apollo Server是通过startStandaloneServer启动的,只需要调整服务器启动逻辑,确保能拿到正确的GraphQL端点URL就行。
  • graphql-request的request方法会直接返回查询结果的data部分,不需要像supertest那样取res.data,所以可以直接断言response.word.id。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:12:13