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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:24:25