Javascript 获得';超过2000ms的超时时间';摩卡咖啡的错误
下面是我的代码。它删除数据库并为测试用例添加两个用户。 当我在mongo数据库中手动验证它时,所有内容都显示正确,但在mocha测试用例中,即使在定义完done参数并调用它之后,我也会得到超时错误 请帮我做这个Javascript 获得';超过2000ms的超时时间';摩卡咖啡的错误,javascript,node.js,unit-testing,mocha.js,Javascript,Node.js,Unit Testing,Mocha.js,下面是我的代码。它删除数据库并为测试用例添加两个用户。 当我在mongo数据库中手动验证它时,所有内容都显示正确,但在mocha测试用例中,即使在定义完done参数并调用它之后,我也会得到超时错误 请帮我做这个 const用户=[{ _id:new ObjectID(), 电子邮件:“第一” }, { _id:new ObjectID(), 电子邮件:“第二” }]; 每次之前((完成)=>{ 移除({})。然后(()=>{ 返回User.insertMany(用户); })。然后(()=>d
const用户=[{
_id:new ObjectID(),
电子邮件:“第一”
}, {
_id:new ObjectID(),
电子邮件:“第二”
}];
每次之前((完成)=>{
移除({})。然后(()=>{
返回User.insertMany(用户);
})。然后(()=>done());
})
在摩卡咖啡中,默认情况下,测试将在2000毫秒后超时。即使您100%正确地处理了异步(您没有),如果您执行的异步操作耗时超过2秒,mocha也会假定失败。即使异步操作在每个之前的或其他钩子中,也是如此
要改变这一点,您需要在测试实例上调用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));
});
这样,如果其中任何一个承诺被拒绝,摩卡将知道并显示拒绝,而不是坐在那里等待测试超时
如果愿意,您甚至可以使用async/await
:
beforeEach(async function() {
this.timeout(6000); // For 6 seconds.
await User.remove({});
await User.insertMany(users);
});
可以是returnuser.insertMany(用户)代码>抛出一个错误。试着给你的未来添加一个catch
语句,看看它是否被调用。我说的“未来”是指“承诺”:)不,我试过了,但没有发现错误。。它输出了相同的错误。。