使用Mongoose调用简单方法时Mocha测试为何超时?
Mongoose调用时Mocha测试超时问题排查
在使用Mongoose进行简单调用时,Mocha测试出现超时错误,相关代码及错误信息如下:
测试代码
describe('User Repository', () => { describe('findById', () => { it('Returns a user that exists in the db by id', async () => { const fakeUserId = "62ce9f5066cd11e576a3deb3" const user = await UserRepository.findUserById(ukUserId) expect(user._id).to.equal("62ce9f5066cd11e576a3deb3") }) }) })
被测试方法
import {Types} from 'mongoose'; import {User} from '../../models/users.model'; import {UserDocument} from '../../interfaces/mongoose.gen'; class UserRepository { static findUserById = async ( userId: Types.ObjectId | string, ): Promise<UserDocument | null> => User.findById(userId) } export default UserRepository;
超时错误信息
Error: Timeout of 5000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. at listOnTimeout (node:internal/timers:559:17) at processTimers (node:internal/timers:502:7)
排查及解决方法
- 变量名拼写错误:测试代码中定义了
fakeUserId,但调用findUserById时传入的是未定义的ukUserId,这会导致Promise无法正常resolve,测试一直等待直到超时。将ukUserId替换为fakeUserId即可修复。 - 数据库未建立连接:测试运行前未初始化Mongoose数据库连接,
User.findById会一直处于等待连接的状态,最终触发超时。可以在测试套件前后添加连接/断开逻辑:
import mongoose from 'mongoose'; describe('User Repository', () => { before(async () => { await mongoose.connect('你的数据库连接字符串'); }); after(async () => { await mongoose.disconnect(); }); describe('findById', () => { // 测试用例 }); });
- 测试数据不存在:如果数据库中没有
62ce9f5066cd11e576a3deb3这个ID的用户,findUserById会返回null,后续访问user._id会抛出未捕获的错误,导致Promise reject,Mocha无法及时处理从而超时。可以在测试前插入测试数据,同时增加空值判断:
it('Returns a user that exists in the db by id', async () => { const fakeUserId = "62ce9f5066cd11e576a3deb3"; // 插入测试数据 await User.create({ _id: fakeUserId, name: 'Test User' }); const user = await UserRepository.findUserById(fakeUserId); expect(user?._id.toString()).to.equal(fakeUserId); });
- 超时时间不足:如果数据库操作确实需要更长时间,可以为测试用例单独设置超时时间:
it('Returns a user that exists in the db by id', async () => { // 测试逻辑 }).timeout(10000); // 设置为10秒超时
内容的提问来源于stack exchange,提问作者Robert Griffith
相关产品推荐
相关产品推荐

