Mocha测试遇'Timeout of 2000ms exceeded'错误,用done仍无效求助
Mocha beforeEach 超时问题排查与解决
我来帮你搞定这个超时问题!手动验证数据正常但测试超时,核心问题大概率出在Promise链的错误处理缺失或者异步操作没正确收尾上,下面给你具体分析和解决方案:
1. 未捕获Promise异常导致done未触发
你的代码只处理了Promise成功的分支,完全没考虑失败的情况。如果User.remove({})或者User.insertMany(users)任何一步出错(比如数据库连接异常、字段验证失败),Promise会进入rejected状态,但没有catch块处理,done()永远不会被调用,Mocha就会因为等待超时报错。
修改方案:添加catch捕获错误并传递给done
const users = [{ _id: new ObjectID(), email: 'First' }, { _id: new ObjectID(), email: 'Second' }]; beforeEach((done) => { User.remove({}) .then(() => User.insertMany(users)) .then(() => done()) .catch(err => { console.error('初始化数据出错:', err); // 打印错误方便排查具体问题 done(err); // 把错误传给Mocha,终止测试并显示错误信息 }); });
2. 改用async/await写法(更简洁不易出错)
Mocha原生支持async函数,不需要手动管理done,只要用await等待所有异步操作完成即可,异常会自动被Mocha捕获并处理:
const users = [{ _id: new ObjectID(), email: 'First' }, { _id: new ObjectID(), email: 'Second' }]; beforeEach(async () => { await User.remove({}); await User.insertMany(users); });
额外排查点
- 确认你的
User模型已经正确连接到MongoDB数据库,有时候模型未初始化连接会导致操作卡住 - 可以在
insertMany之后加个日志,比如console.log('数据初始化完成'),看是否真的执行到了这一步
内容的提问来源于stack exchange,提问作者Vikrant Pradhan
相关产品推荐
相关产品推荐

