如何使用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
相关产品推荐
相关产品推荐

