使用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
相关产品推荐
相关产品推荐

