所以我在下面有这个代码。它删除了db并为测试用例添加了两个用户。 当我在mongo数据库中手动验证时,一切都显示正确,但在mocha测试用例中,即使在定义完成参数并调用它之后,我也会收到超时错误。
请帮我解决这个问题。
const users = [{
_id: new ObjectID(),
email: 'First'
}, {
_id: new ObjectID(),
email: 'Second'
}];
beforeEach((done) => {
User.remove({}).then(() => {
return User.insertMany(users);
}).then(() => done());
})

答案 0 :(得分:0)
在mocha中,默认情况下,测试将在2000 ms后超时。即使你正确地处理异步100%(你不是),如果你执行一个超过2秒的异步操作,mocha将假设失败。即使异步操作在beforeEach
或其他钩子中也是如此。
要更改此设置,您需要在测试实例上调用timeout
方法,为其提供足够高的值。要访问测试实例,您需要使用function
关键字而不是箭头语法定义测试函数,并且它将在测试函数中以this
形式提供:
beforeEach(function(done) {
this.timeout(6000); // For 6 seconds.
User.remove({}).then(() => {
return User.insertMany(users);
}).then(() => done());
});
但是你能以什么方式更好地处理这里的异步?正如Henrik在评论中指出的那样,如果您的任何一个数据库调用失败,您将永远不会调用done
。说实话,既然你已经在处理承诺,那么你甚至不应该使用done
回调。相反,只需通过返回链式承诺来使用Mocha的内置承诺支持。
beforeEach(function() {
this.timeout(6000); // For 6 seconds.
return User.remove({})
.then(() => User.insertMany(users));
});
这样,如果其中任何一个承诺拒绝,Mocha就会知道并会显示拒绝,而不是只是等待你的测试超时。
如果您愿意,甚至可以使用async/await
:
beforeEach(async function() {
this.timeout(6000); // For 6 seconds.
await User.remove({});
await User.insertMany(users);
});