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()
});