以前の関数呼び出しからのデータを必要とするいくつかのモカテストがあります。ただし、私のコードは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();
});
});
任意のアイデアをいただければ幸いです。ありがとう!
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);
});
this.timeout()
は単一のテストのタイムアウトを延長しますが、それはあなたの質問に対する答えではありません。 this.timeout()
は、currentテストのタイムアウトを設定します。
しかし、心配しないでください、とにかく大丈夫です。テストは並行して実行されず、連続して実行されるため、グローバルなアプローチに問題はありません。
まず第一に、適切な単体テストのために、テストとテストの間に何らかのスリープを必要とすべきではありません。スリープが必要な場合、これは、テスト中の関数が予期されるタスクを完了する前に遅延を必要とすることを意味します。関数を終了すると、その有効期間が終了し、予想される結果がすぐに取得される必要があります。
最初:
このスレッドには素晴らしい答えがあります!私は個人的に@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つ、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);