mocha before()の非同期関数は常にit()仕様の前に終了していますか?


89

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

1
これはうまくいくはずです。beforeハンドラーからpromiseを確実に返す必要があるだけです。例before(function () { return db.collection...}
ブローファ

回答:


125

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

これでプロモをモカに返すことができ、モカはそれが完了するのを待ってから続行します。たとえば、次のテストは成功します:

let a = 0;
before(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      a = 1;
      resolve();
    }, 200);
  });
});
it('a should be set to 1', () => {
  assert(a === 1);
});

ここにドキュメントがあります

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

他のすべてが発生する前に非同期リクエストを完了させたい場合doneは、beforeリクエストでパラメータを使用し、コールバックで呼び出す必要があります。

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のドキュメントを参照してください。


非同期操作に時間がかかりすぎると、あまり
役に立た

Mochaはフックでのpromiseをサポートするようになりました-mochajs.org/#working-with-promises。使用する必要はありませんdone。約束を返すだけです。
ブローファ

また、次のこともできます:プロミスを返すbefore(function () { return db.collection('user').remove({}); })のでremove()、それをラッピングする必要はありませんnew Promise()
ブレントグリフ

7

うまくいけば、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
どうafter()ですか?私awaitはそれを呼び出すと正常に動作しますbefore()(DBエントリを削除します)が、まったく同じものをに入れてafter()describe()...it()、データが削除されていないため、1秒が始まるまでに何も削除されず、失敗します。
Juha Untinen、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.