Jest测试Express+MongoDB API本地正常,CircleCI运行超时如何解决?
修复方案
问题根源
你遇到的两个报错为关联问题:
- CircleCI运行环境未配置
NODE_ENV=test变量,测试代码未进入Mock数据库分支,尝试连接不存在的真实数据库触发beforeAll钩子超时 - 数据库关闭逻辑未做环境判断,非测试场景下直接调用未初始化的Mockgoose的
shutdown()方法触发属性读取错误,同时异常导致数据库连接未正常关闭,最终Jest进程无法退出
分步修复
1. 修正CircleCI配置
首先确认你的配置文件后缀为.yml而非你标注的.ylm,然后添加环境变量指定测试环境:
version: 2.1 jobs: build: docker: - image: circleci/node:16.3.0 environment: NODE_ENV: test # 新增测试环境标识 working_directory: ~/Mealplanr-api/api steps: - checkout: path: ~/Mealplanr-api - run: name: Install dependencies command: | yarn install - run: name: Run tests command: | yarn test:ci - store_test_results: path: test-results - store_artifacts: path: test-results
2. 修复数据库关闭逻辑
修改connect.ts中的closeDB方法,仅在测试环境下操作Mockgoose:
export async function closeDB() { if (process.env.NODE_ENV === 'test') { await mockgoose.shutdown(); } await disconnect(); }
3. 适配CI环境调整超时时间(可选)
CI环境的计算资源通常弱于本地,初始化Mock数据库耗时更长,可以单独给钩子设置更高的超时:
// users.spec.ts中修改beforeAll beforeAll(async () => { await connectDB(); }, 15000); // 超时调整为15秒
也可以在jest.config.js中添加全局超时配置:
module.exports = { // 原有配置保持不变 testTimeout: 15000 };
4. Mockgoose兼容优化(可选)
Mockgoose已停止维护,对Node.js 16和高版本Mongoose的兼容性较差。如果修改后仍有异常,建议替换为维护更活跃的mongodb-memory-server作为测试用内存数据库。
内容的提问来源于stack exchange,提问作者Andreas G.D Petersen
相关产品推荐
相关产品推荐

