You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest测试Express+MongoDB API本地正常,CircleCI运行超时如何解决?

修复方案

问题根源

你遇到的两个报错为关联问题:

  1. CircleCI运行环境未配置NODE_ENV=test变量,测试代码未进入Mock数据库分支,尝试连接不存在的真实数据库触发beforeAll钩子超时
  2. 数据库关闭逻辑未做环境判断,非测试场景下直接调用未初始化的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:54:02