Javascript mocha before()中的异步函数总是在它()规范之前完成?

Javascript mocha before()中的异步函数总是在它()规范之前完成?,javascript,asynchronous,mocha.js,Javascript,Asynchronous,Mocha.js,我在before()中有一个回调函数,用于清理数据库。 before()中的所有内容是否保证在it()开始之前完成 before(function(){ db.collection('user').remove({}, function(res){}); // is it guaranteed to finish before it()? }); it('test spec', function(done){ // do the test }); after(function()

我在
before()
中有一个回调函数,用于清理数据库。
before()
中的所有内容是否保证在
it()开始之前完成

before(function(){
   db.collection('user').remove({}, function(res){}); // is it guaranteed to finish before it()? 
});

it('test spec', function(done){
  // do the test
});

after(function(){
});

对于新的摩卡咖啡版本:

您现在可以向摩卡返还承诺,摩卡将等待承诺完成后再继续。例如,以下测试将通过:

let a = 0;
before(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      a = 1;
      resolve();
    }, 200);
  });
});
it('a should be set to 1', () => {
  assert(a === 1);
});
您可以找到文档

对于旧版摩卡咖啡:

如果希望异步请求在其他事情发生之前完成,则需要在before请求中使用
done
参数,并在回调中调用它

然后,Mocha将等待调用
done
以开始处理以下块

before(function (done) {
   db.collection('user').remove({}, function (res) { done(); }); // It is now guaranteed to finish before 'it' starts.
})

it('test spec', function (done) {
  // execute test
});

after(function() {});
不过,您应该小心,因为不为单元测试而存根数据库可能会大大降低执行速度,因为与简单的代码执行相比,数据库中的请求可能相当长


有关更多信息,请参阅。

,希望您的db.collection()能够返回一个承诺。如果是,那么也可以在before()中使用async关键字


请注意,如果异步操作花费的时间太长,您将得到一条没有多大帮助的失败消息:Mocha现在支持hooks-中的承诺。无需使用
done
。只需返回一个承诺。您还可以:
before(function(){return db.collection('user').remove({});})
因为
remove()
返回一个承诺,所以无需将其包装在
new promise()中。
这应该可以工作。您只需要确保在处理程序之前从
返回承诺。例如,
before(function(){return db.collection…}
after()
怎么样?当我在
before()
中调用它时,我的
wait
工作正常(它会删除一个db条目),但是如果我在
after()
中放入完全相同的内容,它在第二秒钟之前不会删除任何内容
description()…它()
由于未删除数据而开始并失败。
// Note: I am using Mocha 5.2.0.
before(async function(){
   await db.collection('user').remove({}, function(res){}); // it is now guaranteed to finish before it()
});