Reaction测试体系:用ReactionTestAPICore编写GraphQL集成测试的完整教程
【免费下载链接】reactionProject has been discontinued ////// Mailchimp Open Commerce is an API-first, headless commerce platform built using Node.js, React, GraphQL. Deployed via Docker and Kubernetes.项目地址: https://gitcode.com/gh_mirrors/re/reaction
Reaction 是一个基于 Node.js、React 与 GraphQL 构建的 API 优先无头电商(Headless Commerce)平台。它的测试体系中最值得新手学习的,是如何用 ReactionTestAPICore 在 Jest 环境中启动一个"真实但隔离"的 API 服务,从而编写端到端的 GraphQL 集成测试。本教程将带你完整掌握 Reaction 测试体系:从搭建隔离的测试环境,到编写查询(Query)与变更(Mutation)测试,再到模拟登录用户与自动清理数据。
一、Reaction 集成测试的整体架构
Reaction 的 GraphQL 集成测试集中存放在 apps/reaction/tests/integration/ 目录下,官方说明见 README.md。目录结构非常直观:
api/mutations1/、api/mutations2/:按 Mutation 名称划分,如createProduct/、checkout/api/queries/:按 Query 名称划分,如viewer/、ordersByAccountId/general/:通用场景测试,如远程 GraphQL 调用
每个测试目录都遵循统一的"三件套"模式,以 viewer.test.js 为例:
| 文件 | 作用 |
|---|---|
viewer.test.js | Jest 测试主体 |
ViewerFullQuery.graphql | 独立存放的 GraphQL 操作语句 |
核心设计理念:每个测试文件在beforeAll中启动一个独立的 Reaction 应用实例,使用随机命名的临时 MongoDB 数据库,测试结束后testApp.stop()直接丢弃整个临时数据库——因此无需编写任何数据清理代码。
二、ReactionTestAPICore:测试环境的核心
ReactionTestAPICore 是对生产类 ReactionAPICore 的测试包装器,源码位于 packages/api-core/src/ReactionTestAPICore.js。它为测试提供了四个关键能力:
- 一键启动/停止:
start()自动生成随机数据库名(沙箱隔离),并刻意不监听真实端口;stop()会删除整个临时数据库 - 执行 GraphQL 操作:
testApp.query(gql)与testApp.mutate(gql)直接在进程内调用 Apollo Server,返回data,若 GraphQL 报错则直接抛出异常 - 模拟登录态:
setLoggedInUser(user)为用户生成登录令牌并写入上下文,测试即可验证鉴权后的返回结果 - 直接操作数据集合:通过
testApp.collections可像操作 MongoDB 一样预置测试数据
三、编写第一个集成测试:分步指南
下面以一个真实测试为蓝本,拆解完整流程。参考 createProduct.test.js。
步骤 1:准备测试环境与插件
在beforeAll中依次执行:
- 用
importPluginsJSONFile读取 apps/reaction/plugins.json,注册全部业务插件(注意:示例中会删除files插件以避免文件存储报错) - 调用
await testApp.start()启动应用
步骤 2:将 GraphQL 语句外置
通过importAsString工具(位于 packages/api-utils/lib/)把.graphql文件读入字符串,再交给testApp.query()或testApp.mutate()封装成可重复调用的函数。这样测试代码与查询语句彻底分离,可读性大幅提升。
步骤 3:预置数据与登录用户
- 用 Factory 工具(基于工厂模式)快速生成 Account、Group 等模拟对象
- 通过
testApp.collections.Groups.insertOne(...)写入所需权限组 - 调用
testApp.setLoggedInUser({ _id, groups, shopId })模拟管理员登录
步骤 4:断言返回值并自动收尾
测试函数中直接await mutate({ input: ... }),用expect(result).toEqual(...)断言完整的 GraphQL 响应结构;afterAll中一行testApp.stop()完成清理。另外建议加上jest.setTimeout(300000)放宽超时——因为每个测试文件都要真实启动一次应用。
四、进阶技巧与最佳实践
- 鉴权测试成对编写:先在未登录状态执行查询(如
viewer应返回null),再setLoggedInUser后验证完整数据,两个用例即可覆盖权限边界 - 不关心字段的断言:使用
jasmine.any(String)匹配时间戳等动态值,避免断言脆弱 - 按业务域组织目录:新增插件的 API 测试时,遵循
mutations1/操作名/或queries/操作名/的命名惯例,保持与 tests/integration/ 现有 298 个测试文件风格一致 - 核心类同步维护:ReactionTestAPICore 的
registerPlugin注释明确提示需与 ReactionAPICore.js 中真实实现保持同步
五、总结
Reaction 的测试体系展示了一套优雅的 GraphQL 集成测试范式:独立数据库沙箱 + 进程内 Apollo 调用 + 工厂化测试数据 + 零清理代码。理解了 ReactionTestAPICore.js 的设计,你不仅能为 Reaction 编写新测试,也能把这套思路迁移到自己的 Node.js + GraphQL 项目中。
【免费下载链接】reactionProject has been discontinued ////// Mailchimp Open Commerce is an API-first, headless commerce platform built using Node.js, React, GraphQL. Deployed via Docker and Kubernetes.项目地址: https://gitcode.com/gh_mirrors/re/reaction
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考