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

使用Jest测试Mongoose模型时异步查询超时问题排查与解决

解决Jest测试Mongoose模型时的超时问题

嘿,我来帮你搞定这个Jest超时的问题~ 这个错误本质上是Jest没等到你的异步数据库操作完成就判定超时了,大概率是这几个原因导致的,咱们一步步来修复:

1. 先确认MongoDB连接是否在测试前搞定了

如果你的测试代码直接就调用CouponModel.find,但数据库还没连上,那这个查询会一直挂着,最后就触发超时了。

你得在测试套件的beforeAll钩子先把数据库连接建立好,测试完再关掉,比如:

const mongoose = require('mongoose');
const CouponModel = require('../models/coupon'); // 换成你自己的模型路径

// 测试前连接测试数据库(一定要用单独的测试库,别碰生产库!)
beforeAll(async () => {
  await mongoose.connect('mongodb://localhost:27017/test-coupon-db');
});

// 测试全部结束后断开连接,避免Jest一直挂着
afterAll(async () => {
  await mongoose.disconnect();
});

test('should find and return all active coupon codes ', async () => { 
  const res = await CouponModel.find({ active: true }); 
  expect(res).toBeDefined(); 
  console.log(res); 
});

2. 给Jest多留点儿时间(延长超时时间)

如果数据库连接没问题,但查询确实需要比默认时间更长(比如测试数据量大),那可以给单个测试或者全局设置更长的超时:

单独给这个测试用例加超时

在test函数的第三个参数里指定超时毫秒数,比如10秒:

test('should find and return all active coupon codes ', async () => { 
  const res = await CouponModel.find({ active: true }); 
  expect(res).toBeDefined(); 
  console.log(res); 
}, 10000); // 这里把超时设为10000ms(10秒)

全局修改Jest超时时间

在项目根目录的jest.config.js里加配置:

module.exports = {
  testTimeout: 10000, // 全局把所有测试的超时设为10秒
};

3. 确保测试数据存在(可选但有用)

如果你的测试库里根本没有active: true的优惠券,find会返回空数组,但一般不会超时,但如果是因为其他异常导致查询卡住,也可能出问题。可以在每个测试前插入测试数据,确保查询有结果:

beforeEach(async () => {
  // 先清空之前的测试数据,避免干扰
  await CouponModel.deleteMany({});
  // 插入两条测试用的优惠券,一条active,一条不是
  await CouponModel.create([
    { code: 'SAVE10', active: true },
    { code: 'EXPIRED', active: false },
  ]);
});

最后总结一下

最常见的问题就是数据库连接没在测试前初始化,或者测试后没关闭,导致异步操作一直挂着。先把连接的问题搞定,再根据情况调整超时时间,应该就能解决这个超时错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:55:20