Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获得';超过2000ms的超时时间';摩卡咖啡的错误_Javascript_Node.js_Unit Testing_Mocha.js - Fatal编程技术网

Javascript 获得';超过2000ms的超时时间';摩卡咖啡的错误

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

下面是我的代码。它删除数据库并为测试用例添加两个用户。 当我在mongo数据库中手动验证它时,所有内容都显示正确,但在mocha测试用例中,即使在定义完done参数并调用它之后,我也会得到超时错误

请帮我做这个

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
语句,看看它是否被调用。我说的“未来”是指“承诺”:)不,我试过了,但没有发现错误。。它输出了相同的错误。。