获得超过2000毫秒的超时时间'摩卡错误

时间:2018-05-01 07:36:04

标签: javascript node.js unit-testing mocha

所以我在下面有这个代码。它删除了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());
 
})




1 个答案:

答案 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);
});