web-dev-qa-db-ja.com

モカの単一テストケースのタイムアウトを増やす方法

テストケースでネットワーク要求を送信していますが、2秒(デフォルトのタイムアウト)を超えることがあります。

単一のテストケースのタイムアウトを増やすにはどうすればいいですか?

374
Mahendra S

ここに行きます: 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);
619
Dan Kohn

Es6のarrow関数を使いたい場合は、it定義の最後に.timeout(ms)を追加することができます。

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

少なくともこれはTypeScriptで動作します。

125
Chris Sparrow

(今日この記事に出くわしたので)

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 関数を提供することは不可能です。

一番下の行 :タイムアウトを長くする必要がある機能には、矢印機能を使用しないでください。

68
chriskelly

NodeJSで使用している場合は、package.jsonでタイムアウトを設定できます。

"test": "mocha --timeout 10000"

そうすれば、npmを使って次のように実行できます。

npm test
38
Sumit Jolly

コマンドラインから:

mocha -t 100000 test.js
20
andrey

また、別のアプローチを取り、ネットワークリソースへの呼び出しをスタブオブジェクトまたはモックオブジェクトに置き換えることも考えられます。 Sinon を使用すると、開発作業に重点を置いて、ネットワークサービスからアプリを切り離すことができます。

16
David Souther

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)は常に使用されるよりも避けます。

7
alditis