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


405

テストケースでネットワークリクエストを送信していますが、2秒(デフォルトのタイムアウト)以上かかる場合があります。

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

回答:


669

どうぞ: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);

23
タイムアウトがミリ秒単位であり、それはデフォルト2000
イーサン・ミック

47
私はes6の矢印関数を使用しており、「this」が機能するためには古い「関数」定義にフォールバックする必要がありました。
Aruna Herath、2015年

1
また同様に、フックのために働くbefore(function(done){this.timeout(5 * 1000);...});
JP

2
@AHアロー関数が機能しなかった理由は、字句のこれ
Tanner Faulkner

11
アロー機能で動作させる方法はありますか?編集:.timeout(500)末尾に追加it(...).timeout(500)
不安定な

136

es6矢印関数を使用したい場合.timeout(ms)は、it定義の最後にa を追加できます。

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

少なくともこれはTypescriptで機能します。


3
この作品は、しかし、.timeoutモカのためのDefinitelyTypedのタイピングには含まれていません。i.imgur.com/jQbWCn1.png -使用this.timeout(2000)またはthis.slow(500)エラーなしで通常の古い機能の作品やコンパイルをして
レオンアドラーを

3
残念ながら、これはに対してのみ機能しit、に対しては機能しませんdescribe
robrich、

3
describe()またはのためにこれを行う方法はありcontext()ますか?
不安定な

1
@LeonAdler .timeoutがDefinitelyTypedのMochaタイピングに含まれるようになりましたMocha.IRunnable。ただし、これらのテストを実行するためにWebstorm IDEを使用している場合、注意点:何らかの理由で、WebStormのMocha統合プラグインは、.timeout()追加されたMochaテストをまだ認識しません(つまり、横に[実行]ボタンが表示されません)。したがって、this.timeout()代わりに矢印関数を使用しないようにすることを推奨します。
ジェイミーバーチ2017

これは完璧です。promiseを返す非同期関数の場合は、done()を省略できます。
ビロバートン

72

(今日これに遭遇したので)

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にバインドしてタイムアウト関数を提供することはできません。

結論:タイムアウトを増やす必要がある関数には、矢印関数を使用しないでください。


2
アロー関数はこれをまったく持っていないからです。詳細はこちら:blog.getify.com/arrow-this
atoth

2
はい、しかし私は答えでこれを説明しました。私のコメントを見てください。//コード内。わかりやすくするために、コードブロックの外側で説明する必要があります。これは確かに存在しますが、外側のスコープからのものです。
クリスケリー

1
私の説明はより正確です。this矢印関数には拘束力はありません。同じように、ある種の、異なるだけの機能を示唆するものではありません。それらにはレキシカルスコープしかありません。存在しないこれをバインドすることはできません。なぜだこと.bind.callなどのことでは動作しません。
atoth

1
それは本当です-そしてあなたの権利はより正確です。ありがとう
chriskelly

1
だからこそ、必要なときにだけ太い矢印を使用するべきだと思いますが、私はそれが何であるのか分からなくなりましたthis
xdumaine 2016

42

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

"test": "mocha --timeout 10000"

その後、次のようにnpmを使用して実行できます。

npm test

1
これは、単一のテストケースではなく、すべてのテストケースに
当てはまります

これは質問の答えにはなりませんが、すべてのテストで増加するかどうか気にしない私のユースケースでは十分でした。ここで終わる人の多くは、それが1つのテストであるか、すべてのテストであるかを気にしないかもしれないと思うので、この答えがここにあることに感謝します。
ビラバートン

22

コマンドラインから:

mocha -t 100000 test.js

14
これにより、質問のように「特定のテストケース」ではなく、すべてのテストケースのタイムアウトが増加します。
ルイ

16

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


7
それは完全に無関係ではありません。頻繁に、ネットワークの応答をスタブ化することは意味があるので、そのマシンが稼働している、または正しい応答を返すことに依存する必要はありません。ただし、応答自体をテストしている場合は、そうする必要があります。
2015年

2
私はいくつかの統合テストを構築するためにsinon / mochaを使用しているので、より高いタイムアウトが関係します。
jcollum 2017年

9

のテストナビゲーション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)これらすべての時間を使用するよりは避けます。


2

これは私のために働いた!before()で動作するものを見つけることができませんでした

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});

.timeout()は完全に機能しました!
acidjazz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.