如何配置Jest等待globalSetup执行完成后再启动测试用例
Jest globalSetup 数据库连接未生效问题解决方案
Jest 原生默认会等待 globalSetup 导出的异步函数完全 resolve 后才会启动测试流程,你遇到的问题90%是由进程隔离特性导致的:globalSetup 运行在 Jest 主进程,而每个测试套件运行在独立的 worker 子进程中,主进程建立的数据库连接无法被子进程共享,才会出现首个用例连接失败的现象。
对应解决方案如下:
优先推荐:把连接逻辑移到测试进程初始化配置中
无需使用 globalSetup 做应用层数据库连接,改用 setupFilesAfterEnv 配置实现每个测试进程初始化时建立连接:
- 修改
jest.config.js新增配置:
module.exports = { // 保留原有其他配置 setupFilesAfterEnv: ['<rootDir>/path/to/test-init.js'], // 延长超时时间,避免数据库连接未完成就触发超时报错 testTimeout: 10000 }
- 新增对应的
test-init.js文件:
import { mongoConnect } from "../../server/services/mongo"; // 每个测试进程启动后,所有用例执行前先建立数据库连接 beforeAll(async () => { await mongoConnect(); });
- 优化
mongoConnect为单例实现,避免同一进程下重复建立连接:
// server/services/mongo.js 参考实现 import mongoose from 'mongoose'; let cachedConnection = null; export async function mongoConnect() { // 已建立连接的场景直接复用缓存 if (cachedConnection) return cachedConnection; cachedConnection = await mongoose.connect(process.env.TEST_MONGO_URI); return cachedConnection; }
若需保留globalSetup配置
globalSetup 仅适合做全局环境初始化操作,比如启动本地测试数据库实例、初始化测试库表结构等,不要在这里建立应用层数据库连接:
- 确保
jest.config.js正确注册globalSetup:
module.exports = { globalSetup: '<rootDir>/path/to/your/global-setup.js', // 其他配置保留 }
- 应用层数据库连接逻辑还是按照上方
setupFilesAfterEnv的方式配置即可。
内容的提问来源于stack exchange,提问作者SKeney
相关产品推荐
相关产品推荐

