在这篇博文中,我们将探讨使用 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中文网其他相关文章!

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。

Python和JavaScript的未来趋势包括:1.Python将巩固在科学计算和AI领域的地位,2.JavaScript将推动Web技术发展,3.跨平台开发将成为热门,4.性能优化将是重点。两者都将继续在各自领域扩展应用场景,并在性能上有更多突破。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

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

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

Dreamweaver Mac版
视觉化网页开发工具