使用 Jest 和 SuperTest 测试 GraphQL 应用程序
在这篇博文中,我们将探讨使用 Jest 和 SuperTest 测试 GraphQL API 所涉及的挑战和解决方案。这个旅程始于需要在 Jest 测试中模拟标头,特别是基于令牌的身份验证。
挑战:在 Jest 中模拟标题
在为 Woovi 挑战开发 Todo 后端 GraphQL 项目时,我遇到了一个重大障碍。我需要测试 GraphQL API 的身份验证,该身份验证依赖于 HTTP 标头中传递的 JSON Web 令牌 (JWT)。最初,我努力寻找一种直接的方法来在 Jest 中模拟这些标头。标准 Jest 设置还不够,因为它没有像真实服务器那样直接处理 HTTP 请求和响应。
解决方案:发现 SuperTest
经过多次尝试和错误,我遇到了 SuperTest,一个专为 HTTP 断言设计的库。 SuperTest 允许您像测试真实客户端一样测试 HTTP 服务器,从而扩展了 Jest 的功能。此功能使得模拟标头成为可能,包括我的 API 身份验证所需的授权令牌。
设置测试环境
在进行测试之前,让我们先设置环境。
- 安装依赖项 首先,确保您安装了 Jest、SuperTest 和 Faker:
npm install --save-dev jest supertest faker
- 配置 Jest 创建 jest.config.js 文件:
module.exports = { preset: 'ts-jest', testEnvironment: 'node', };
- 编写测试用例 环境准备好之后,我们就可以编写测试用例了。
使用 SuperTest 编写测试
SuperTest 成为了这种情况下的游戏规则改变者。以下是我如何使用它来测试 API 的 CRUD 操作和身份验证。
使用 SuperTest 测试 CRUD 操作
- 安装和拆卸 使用 Jest 的 beforeAll 和 afterAll 钩子进行设置和拆卸:
import { connect, disconnectDatabase } from './mongooseConnection'; import supertest from 'supertest'; import app from './../index'; beforeAll(async () => { await connect(); }); afterAll(async () => { await disconnectDatabase(); });
- 测试身份验证和令牌使用 创建一个辅助函数来注册用户并获取令牌:
import { faker } from '@faker-js/faker'; import { graphql } from 'graphql'; import { schema } from '../schema'; async function authUserTest() { const userTest = { name: faker.name.firstName(), email: faker.internet.email(), password: faker.internet.password(), }; const source = ` mutation { register(name: "${userTest.name}", email: "${userTest.email}", password: "${userTest.password}") { token user { name email } } } `; const result = await graphql({ schema, source }); const data = result.data?.register; return data.token; }
-
测试任务 CRUD 操作
- 创建新任务
it('should create a new task', async () => { const todo = { task: faker.lorem.words(), status: faker.helpers.arrayElement(['pending', 'complete', 'in progress']), }; const query = ` mutation { todo(task: "${todo.task}", status: "${todo.status}") { task status } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.todo).toMatchObject(todo); });
登录后复制
-
检索所有任务
it('should retrieve all tasks', async () => { const query = ` query { todos { _id task status } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.todos).toBeInstanceOf(Array); });
登录后复制 -
更新任务
it('should update a task', async () => { const todos = await Todo.find(); const randomTodo = todos[Math.floor(Math.random() * todos.length)]; const updatedTask = faker.lorem.words(); const updatedStatus = faker.helpers.arrayElement(['pending', 'complete', 'in progress']); const query = ` mutation { updateTodo(_id: "${randomTodo._id}", task: "${updatedTask}", status: "${updatedStatus}") { task status } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.updateTodo.task).toBe(updatedTask); expect(body.data.updateTodo.status).toBe(updatedStatus); });
登录后复制 -
删除任务
it('should delete a task', async () => { const todos = await Todo.find(); const randomTodo = todos[Math.floor(Math.random() * todos.length)]; const query = ` mutation { deleteTodo(_id: "${randomTodo._id}") { _id } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.deleteTodo._id).toBe(randomTodo._id); });
登录后复制
运行测试
使用 Jest 运行测试:
npm test
此命令将执行所有测试文件,并提供详细的结果报告。
结论
在 Jest 中模拟 header 的困难导致了 SuperTest 的发现,它大大简化了过程。通过利用 SuperTest 和 Jest,我能够有效地测试 GraphQL API 的身份验证和 CRUD 操作,确保应用程序的安全性和功能。分享这个学习过程突显了公共学习和社区驱动的问题解决的力量。
以上是使用 Jest 和 SuperTest 测试 GraphQL 应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

zustand异步操作中的数据更新问题在使用zustand状态管理库时,经常会遇到异步操作导致数据更新不及时的问题。�...
