web-dev-qa-db-ja.com

次のテストを実行する前にMochaを待機させます

以前の関数呼び出しからのデータを必要とするいくつかのモカテストがあります。ただし、私のコードはWebサービスを使用しているため、次のテストを実行する前に、所定の時間待機するようにします。

このようなもの:

var global;

it('should give some info', function(done) {
  run.someMethod(param, function(err, result) {
    global = result.global
  done();
  });
});

wait(30000); // basically block it from running the next assertion

it('should give more info', function(done) {
  run.anotherMethod(global, function(err, result) {
    expect(result).to.be.an('object');
  done();
  });
});

任意のアイデアをいただければ幸いです。ありがとう!

14
R.A. Lucas

setTimeoutは間違いなく役立ちますが、それを行うための「よりクリーンな」方法があるかもしれません。

ここのドキュメント は非同期コードのテスト中にタイムアウトエラーを回避するために実際にthis.timeout(delay)を使用するように指示しているため、注意してください。

var global;

it('should give some info', function(done) {
  run.someMethod(param, function(err, result) {
    global = result.global
  done();
  });
});

it('should give more info', function(done) {
    this.timeout(30000);

    setTimeout(function () {
      run.anotherMethod(global, function(err, result) {
        expect(result).to.be.an('object');
        done();
      });
    }, 30000);
 });
20
Flops

this.timeout()は単一のテストのタイムアウトを延長しますが、それはあなたの質問に対する答えではありません。 this.timeout()は、currentテストのタイムアウトを設定します。

しかし、心配しないでください、とにかく大丈夫です。テストは並行して実行されず、連続して実行されるため、グローバルなアプローチに問題はありません。

10
Zlatko

まず第一に、適切な単体テストのために、テストとテストの間に何らかのスリープを必要とすべきではありません。スリープが必要な場合、これは、テスト中の関数が予期されるタスクを完了する前に遅延を必要とすることを意味します。関数を終了すると、その有効期間が終了し、予想される結果がすぐに取得される必要があります。

2
Emre Tapcı

最初:

このスレッドには素晴らしい答えがあります!私は個人的に@Flopsの回答が好きでした(私の投票を得ました)

2番目:

これを(可能な限り)明確にするために、ここで私が最終的に(テストおよび検証)したものと非常によく似たコードサンプルを示します。

function delay(interval) 
{
   return it('should delay', done => 
   {
      setTimeout(() => done(), interval)

   }).timeout(interval + 100) // The extra 100ms should guarantee the test will not fail due to exceeded timeout
}

it('should give some info', function(done) {
  run.someMethod(param, function(err, result) {
    global = result.global
  done();
  });
});

delay(1000)

it('should give more info', function(done) {
  run.anotherMethod(global, function(err, result) {
    expect(result).to.be.an('object');
  done();
  });
});

補足:遅延関数を次々に使用しても、一貫性を維持できます(テスト順序)

1
ymz

もう1つ、promiseを使用します。

it('go, then stop', (done) => {
// this.skip();
go()
  .then((response) => { console.log('go was called'); return response; })
  .then(response => response.should.equal('acknowledged'))
  .then(() => new Promise(resolve => setTimeout(() => { resolve(); }, 3000)))
  .then(() => console.log('3 second wait is over'))
  .then(() => stop())
  .then(response => response.should.equal('acknowledged'))
  .then(() => done());
  }).timeout(15000);
0
Jeff Lowery