web-dev-qa-db-ja.com

mocha before()の非同期関数はit()スペックの前に常に終了しますか?

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(){
});
81
Nicolas S.Xu

新しいモカバージョンの場合:

これで、mochaにプロミスを返すことができ、mochaは続行する前に約束が完了するのを待ちます。たとえば、次のテストは合格します。

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

ただし、データベース内のリクエストは単純なコード実行に比べてかなり長い可能性があるため、ユニットテスト用にデータベースをスタブ化しないと実行速度が大幅に低下する可能性があるため、注意が必要です。

詳細については、 Mocha documentation を参照してください。

120

Db.collection()がpromiseを返すことを願っています。はいの場合、before()でasyncキーワードを使用することもできます

// 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()
});
4
Mandeep Singh