テストケースでネットワーク要求を送信していますが、2秒(デフォルトのタイムアウト)を超えることがあります。
単一のテストケースのタイムアウトを増やすにはどうすればいいですか?
ここに行きます: http://mochajs.org/#test-level
it('accesses the network', function(done){
this.timeout(500);
[Put network code here, with done() in the callback]
})
矢印機能の場合は、次のように使用します。
it('accesses the network', (done) => {
[Put network code here, with done() in the callback]
}).timeout(500);
Es6のarrow関数を使いたい場合は、it
定義の最後に.timeout(ms)
を追加することができます。
it('should not timeout', (done) => {
doLongThing().then(() => {
done();
});
}).timeout(5000);
少なくともこれはTypeScriptで動作します。
(今日この記事に出くわしたので)
ES2015太い矢印の構文を使用するときは注意してください。
これは失敗します:
it('accesses the network', done => {
this.timeout(500); // will not work
// *this* binding refers to parent function scope in fat arrow functions!
// i.e. the *this* object of the describe function
done();
});
編集:なぜ失敗するのか:
@atothがコメントで述べているように、 太い矢印 関数には独自の this バインディングはありません。したがって、 it 関数がコールバックの this にバインドして timeout 関数を提供することは不可能です。
一番下の行 :タイムアウトを長くする必要がある機能には、矢印機能を使用しないでください。
NodeJSで使用している場合は、package.jsonでタイムアウトを設定できます。
"test": "mocha --timeout 10000"
そうすれば、npmを使って次のように実行できます。
npm test
コマンドラインから:
mocha -t 100000 test.js
また、別のアプローチを取り、ネットワークリソースへの呼び出しをスタブオブジェクトまたはモックオブジェクトに置き換えることも考えられます。 Sinon を使用すると、開発作業に重点を置いて、ネットワークサービスからアプリを切り離すことができます。
Express
でのテストナビゲーションの場合:
const request = require('supertest');
const server = require('../bin/www');
describe('navegation', () => {
it('login page', function(done) {
this.timeout(4000);
const timeOut = setTimeout(done, 3500);
request(server)
.get('/login')
.expect(200)
.then(res => {
res.text.should.include('Login');
clearTimeout(timeOut);
done();
})
.catch(err => {
console.log(this.test.fullTitle(), err);
clearTimeout(timeOut);
done(err);
});
});
});
この例では、テスト時間は4000(4秒)です。
注:setTimeout(done, 3500)
はテストの時間内にdone
が呼び出されるよりはマイナーですが、clearTimeout(timeOut)
は常に使用されるよりも避けます。