新闻详情

新闻详情

首页 / 资讯中心 / 详情

在 Jest 29 中使用 MongoDB:基于 jest-mongodb Preset 的集成测试完整指南

发布时间:2026/9/19 20:25:38来源:尧图网络
在 Jest 29 中使用 MongoDB:基于 jest-mongodb Preset 的集成测试完整指南
在 Jest 29 中使用 MongoDB基于 jest-mongodb Preset 的集成测试完整指南【免费下载链接】jestDelightful JavaScript Testing.项目地址: https://gitcode.com/gh_mirrors/je/jest本篇指南围绕 Jest 官方文档中「Using with MongoDB」一节的实战方案展开借助shelf/jest-mongodbpreset配合 Jest 的 Global Setup/Teardown 与 Async Test Environment 两大 API你可以在真实 MongoDB 实例上编写端到端风格的集成测试无需手动管理数据库进程、无需在测试内加载额外依赖。读完本文你将掌握从安装、配置到编写 CRUD 用例的完整链路并理解 preset、globalSetup 与 testEnvironment 在底层是如何协同工作的。为什么 Jest 可以平滑对接 MongoDBMongoDB 的集成测试天然需要一个真实运行的数据库实例连接、写入、查询、清理数据每一个环节都要求数据库在线可用。Jest 为此提供了两项关键 API见 Configuration.mdglobalSetupstring在全部测试文件运行之前执行一次的钩子可同步或异步接收globalConfig与projectConfig两个参数。典型用法是在这里启动内存版 MongoDBmongod并把实例句柄挂到globalThis上供globalTeardown读取与回收docs/Configuration.md#L855-L879。globalTeardownstring在所有测试文件运行结束后执行一次的钩子用于关闭数据库进程、释放资源docs/Configuration.md#L890-L902。testEnvironmentnode | jsdom | string指定测试运行的环境默认为node也可指向自定义环境对象需符合JestEnvironment形状docs/Configuration.md#L2014-L2113。shelf/jest-mongodb正是把这三者封装成了一个开箱即用的 preset它替你写好了启动 mongod 的 setup 脚本、关闭 mongod 的 teardown 脚本以及注入 MongoDB 连接信息的 testEnvironment。你只需要在配置里声明preset即可获得完整的测试数据库生命周期管理。第一步安装 shelf/jest-mongodbshelf/jest-mongodb以开发依赖形式安装npm install --save-dev shelf/jest-mongodb安装完成后无需在测试文件里额外加载任何依赖——MongoDB 实例的启动与关闭完全由 preset 内置的 global setup/teardown 脚本接管。第二步在 Jest 配置中声明 preset在jest.config.js或package.json的jest字段、jest.config.json中指定 preset{ preset: shelf/jest-mongodb }Jest 的preset配置项指向一个 npm 包该包根目录需提供jest-preset.json、jest-preset.js、jest-preset.cjs或jest-preset.mjs文件见 docs/Configuration.md#L1173-L1212。shelf/jest-mongodb的jest-preset内部即声明了globalSetup、globalTeardown与testEnvironment三项配置从而把数据库生命周期全部托管给 Jest。从源码看preset 的解析发生在 packages/jest-config/src/normalize.ts 的setupPreset函数中packages/jest-config/src/normalize.ts#L171-L185Jest 会基于rootDir解析 preset 模块路径按扩展名查找jest-preset文件随后与用户配置进行合并。其对应的配置归一化测试位于 packages/jest-config/src/tests/normalize.test.ts其中覆盖了 preset 缺失、文件格式非法、依赖缺失、与用户配置合并优先级等场景。这意味着preset 提供的globalSetup/globalTeardown/testEnvironment会自动生效你在自身配置中显式书写的同名配置项可以覆盖 preset 的默认值若 preset 包内缺少jest-preset.*文件Jest 会直接报错并提示对应 normalize.test.ts 中的校验逻辑。第三步编写使用全局 Mongo 全局变量的测试preset 生效后Jest 会在测试环境中注入两个全局变量可直接在测试代码中读取globalThis.__MONGO_URI__MongoDB 实例的连接串globalThis.__MONGO_DB_NAME__为本次测试运行准备的数据库名称。结合官方文档的示例一个完整的插入与查询用例长这样const {MongoClient} require(mongodb); describe(insert, () { let connection; let db; beforeAll(async () { connection await MongoClient.connect(globalThis.__MONGO_URI__, { useNewUrlParser: true, useUnifiedTopology: true, }); db await connection.db(globalThis.__MONGO_DB_NAME__); }); afterAll(async () { await connection.close(); }); it(should insert a doc into collection, async () { const users db.collection(users); const mockUser {_id: some-user-id, name: John}; await users.insertOne(mockUser); const insertedUser await users.findOne({_id: some-user-id}); expect(insertedUser).toEqual(mockUser); }); });要点拆解连接只建立一次在beforeAll中基于__MONGO_URI__建立连接并从中取出__MONGO_DB_NAME__对应的数据库句柄供整个 describe 块复用连接只关闭一次在afterAll中关闭连接避免资源泄漏与测试间互相干扰断言语义写入{_id: some-user-id, name: John}后再按_id读回用toEqual验证文档内容一致无需手工启动数据库__MONGO_URI__指向的内存/临时 MongoDB 实例由 preset 负责启动与销毁因此测试代码里没有出现任何 mongod 相关逻辑。深入原理globalSetup / globalTeardown / testEnvironment 如何协作为了更透彻地理解 preset 做了什么可以把文档中提到的机制拆开来看。Jest 官方在globalSetup一节中给出的示例docs/Configuration.md#L871-L888展示了手工实现时的核心思路——setup 脚本启动 mongod 并把句柄挂到全局module.exports async function (globalConfig, projectConfig) { console.log(globalConfig.testPathPatterns); console.log(projectConfig.cache); // Set reference to mongod in order to close the server during teardown. globalThis.__MONGOD__ mongod; };对应的 teardown 脚本则负责关闭进程module.exports async function (globalConfig, projectConfig) { console.log(globalConfig.testPathPatterns); console.log(projectConfig.cache); await globalThis.__MONGOD__.stop(); };这里有几点值得注意的边界官方文档明确标注globalSetup 中定义的全局变量只能在 globalTeardown 中读取测试套件内部无法直接访问docs/Configuration.md#L865。shelf/jest-mongodb之所以能让测试拿到__MONGO_URI__与__MONGO_DB_NAME__是因为它同时自定义了testEnvironment在环境初始化阶段把连接信息注入到globalThis——这正是文档开篇把「Global Setup/Teardown」与「Async Test Environment」并列作为前提的原因全局钩子只触发一次globalSetup在全部测试文件开始前执行globalTeardown在全部结束后执行多项目运行器下仅当该项目至少运行了一个测试时触发因此数据库进程在整个测试会话中只启动、销毁各一次性能开销可控node_modules 不做转换Jest 会对 setup 文件本身做代码转换但不会转换node_modules中的代码docs/Configuration.md#L867。仓库内 e2e/global-setup/setupWithConfig.js 展示了 global setup 接收(globalConfig, projectConfig)两个参数的实际用法其对应端到端测试位于 e2e/tests/globalSetup.test.ts可作为理解参数形状与调用时机的参考。进阶配置 MongoDB 版本与更多自定义官方文档的结尾指出关于MongoDB 版本选择、内存数据库的磁盘/内存限制、是否启用副本集等更细致的配置需要参考shelf/jest-mongodb自身的文档本仓库为只读镜像不包含该 preset 源码请以你项目node_modules中实际安装的版本为准。在jest-preset之上做自定义时推荐遵循以下模式// jest.config.js const {defineConfig} require(jest); module.exports defineConfig({ preset: shelf/jest-mongodb, // 覆盖 preset 提供的默认值 testTimeout: 20000, // 可叠加你自己的 setup 文件 setupFilesAfterEnv: [./jest.setup.js], });由于 preset 的配置会与你的显式配置做合并preset 中定义的moduleNameMapper、transform等均会被用户配置覆盖见 normalize.test.ts 中「merges with options」系列用例你可以在保留 preset 数据库能力的同时自由补充项目自身的配置项。小结环节你需要做的事背后的机制安装npm install --save-dev shelf/jest-mongodb无配置在 Jest 配置中声明preset: shelf/jest-mongodbjest-preset内含globalSetup/globalTeardown/testEnvironmentpackages/jest-config/src/normalize.ts 完成解析与合并编写测试在beforeAll中用globalThis.__MONGO_URI__连接、用globalThis.__MONGO_DB_NAME__取库preset 的 testEnvironment 注入全局变量生命周期无需手动启动/关闭 mongodglobalSetup启动、globalTeardown关闭参考 docs/Configuration.md#L855-L902 的手工实现示例这套方案的实战价值在于测试环境完全隔离、不依赖本机预装 MongoDB 服务同时因为跑在真实数据库上能覆盖索引、聚合、唯一约束等 mock 难以模拟的数据库行为。需要进一步定制如指定 MongoDB 版本时请查阅你所安装的shelf/jest-mongodb版本自带文档。【免费下载链接】jestDelightful JavaScript Testing.项目地址: https://gitcode.com/gh_mirrors/je/jest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

FaceFusion与91n的搜索谜团:AI换脸开源工具的信息干扰与正确使用 2026/9/19 21:13:46

FaceFusion与91n的搜索谜团:AI换脸开源工具的信息干扰与正确使用

大概半个月前,我在一个技术交流群里看到有人发问:FaceFusion和91n是什么关系?是不是同一家出的?我当时愣了一下,这俩名字怎么会被人放到一起?后来自己动手搜了一圈才明白,原来很多人在搜索引擎里…

阅读更多 →
ComfyUI保姆级教程:从零安装到跑通第一张图的完整指南 2026/9/19 21:13:46

ComfyUI保姆级教程:从零安装到跑通第一张图的完整指南

做ComfyUI这套东西,我真正上手是两年前,当时把秋叶整合包、官方手动版、甚至Linux源码版都折腾了一遍。说句实话,ComfyUI绝对不是那种“装上就能画图”的傻瓜软件,它的学习曲线比WebUI要陡得多,但一旦你理解了节点式工…

阅读更多 →
3秒参考音频就能改词换句:VoiceCraft 零样本语音编辑与TTS 2026/9/19 21:13:46

3秒参考音频就能改词换句:VoiceCraft 零样本语音编辑与TTS

3秒参考音频就能改词换句:VoiceCraft 零样本语音编辑与TTS 【免费下载链接】VoiceCraft Zero-Shot Speech Editing and Text-to-Speech in the Wild 项目地址: https://gitcode.com/GitHub_Trending/vo/VoiceCraft VoiceCraft 是一个神经声码器语言模型&…

阅读更多 →
数据资产管理平台选型:从元数据到数据标准的供应商横评与PoC验证思路 2026/9/19 21:13:46

数据资产管理平台选型:从元数据到数据标准的供应商横评与PoC验证思路

简介:面向企业数据资产管理平台选型场景,这份竞品分析报告从数据语言不统一、数据找不到读不懂、数据不可信、数据不可联等痛点出发,梳理出数据标准、元数据、数据质量、数据安全与主数据管理五大需求方向,并对A、B、C、D四家主流…

阅读更多 →
N_m3u8DL-RE 速览:3 条命令搞定 DASH/HLS/MSS 流媒体下载 2026/9/19 21:13:46

N_m3u8DL-RE 速览:3 条命令搞定 DASH/HLS/MSS 流媒体下载

N_m3u8DL-RE 速览:3 条命令搞定 DASH/HLS/MSS 流媒体下载 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE…

阅读更多 →
QuickDesk 跑 AI 远程操控:模型 Key 用 TaoToken 2026/9/19 21:10:46

QuickDesk 跑 AI 远程操控:模型 Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞