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

Node.js+Jest测试MongoDB插入功能失败,请求排查解决

Jest测试MongoDB模型插入功能的错误修复

错误原因分析

  1. MongooseError:URI未定义
    测试环境中process.env.DATABASE_URL未正确加载,导致Mongoose连接时传入undefined,触发URI无效错误。
  2. ReferenceError:Jest环境销毁后仍有操作
    • 异步连接/数据库操作未使用await等待完成,Jest提前结束测试环境,但后台异步任务仍在运行。
    • 测试结束后未关闭数据库连接,导致Jest子进程资源无法释放,超出重试限制。

分步解决方案

1. 正确加载测试环境变量

在api.test.js最顶部加载测试专用的环境变量文件(如.env.test),确保所有依赖加载前变量已就绪:

// api.test.js 顶部优先加载测试环境变量
require('dotenv').config({ path: './.env.test' });

const request = require("supertest")
const baseURL = "http://localhost:4000"
const baseURL2 = process.env.EXPRESS_SERVER_TEST 
const {MongoClient} = require('mongodb');
var Question = require('../schema/question');
var mongoUtils = require('../mongoUtils');
const mongoose = require('mongoose'); // 引入mongoose用于后续关闭连接

2. 等待异步操作完成

  • beforeAll中必须等待数据库连接完成,否则后续操作会使用未初始化的连接:
beforeAll(async () => {
  await mongoUtils.dbConnectMongoose(); // 等待连接完成
  db = mongoUtils.getDb();
  console.log(`db in app is ${db}`)
});
  • 测试用例中等待save()操作完成,避免Jest提前结束测试:
it('should insert a question', async () => {
  try {
    const q = new Question({ // 使用new关键字实例化模型
      description: "some description",
      hints: ["hint1", "hint2"],
      topic: 'area'
    });
    const result = await q.save(); // 等待保存完成
    console.log(`added question ${result}`);
    expect(result).toBeDefined(); // 增加断言验证结果有效性
  } catch (err) {
    console.log(`error in adding question: ${err}`);
    throw err; // 抛出错误让Jest捕获测试失败
  }
});

3. 测试结束后关闭数据库连接

在afterAll中关闭Mongoose连接,释放资源,避免子进程异常:

afterAll(async () => {
  await mongoose.disconnect(); // 关闭Mongoose连接
  console.log("Database connection closed")
});

4. 增强mongoUtils的错误处理

在mongoUtils.js中增加URI有效性检查,提前拦截错误:

dbConnectMongoose: async function (){
  if (!process.env.DATABASE_URL) {
    throw new Error('DATABASE_URL environment variable is not defined');
  }
  console.log(`trying to connect to uri ${process.env.DATABASE_URL}`);
  const connection = await mongoose.connect(process.env.DATABASE_URL);
  // ... 原有代码
}

验证要点

执行npm test前确认:

  • .env.test文件中正确配置DATABASE_URL和DATABASE变量
  • 所有异步操作均使用await等待完成
  • 测试结束后正确关闭数据库连接

内容的提问来源于stack exchange,提问作者Manu Chadha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:44:49