jasmine-node非同期仕様のタイムアウトを変更するにはどうすればよいですか?


90

run / waitsForブロックに頼らずに、このテストに合格するにはどうすればよいですか?

it("cannot change timeout", function(done) {

     request("http://localhost:3000/hello", function(error, response, body){

         expect(body).toEqual("hello world");

         done();
     });
});

回答:


105

Jasmineのドキュメントに従って、(現在)仕様に直接設定できます。

describe("long asynchronous specs", function() {

    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

    it("takes a long time", function(done) {
        setTimeout(function() {
            done();
        }, 9000);
    });

    afterEach(function() {
        jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });
});

ええ、jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;値を変更することで、Jasmine + Jestを使用してゼロから構築されたまったく新しいセットアップでうまくいきました。期待どおりに動作します。
イグナシオセグラ2017

@willydeeに同意し、cloudinaryでのテストの実行に問題があり、この小さなスニペットが私の助けになりました。
DevYego19年

おそらく、これはの前に発生する必要があることに注意してくださいit。あなたがテストに参加している時までに、開始される前doneにあったものDEFAULT_TIMEOUT_INTERVALにすでに夢中になっているようitです。
ラフィン


43

グローバルなJasmine-Nodeタイムアウトを設定するには、次のようにします。

jasmine.getEnv().defaultTimeoutInterval = timeoutYouWouldPrefer;// e.g. 15000 milliseconds

jasmine.DEFAULT_TIMEOUT_INTERVALを設定することによって行われたと主張するREADMEドキュメントの誤った情報にもかかわらず、デバッグを介して.getEnv()部分を理解した開発者のGabeHicksの功績です。

1つのit()に対してのみカスタムタイムアウトを設定する場合は、タイムアウト(ミリ秒)を3番目の引数(文字列ステートメントと関数の後)として渡してみてください。ここで行われている例がありますが、カスタムタイムアウトがJasmineのデフォルトよりも長い場合はどうなるかわかりません。失敗すると思います。


28
2014年にこの回答に出くわした人のための更新:Jasmine 2の設定では、jasmine.DEFAULT_TIMEOUT_INTERVALが機能します。
Simon Groenewolt 2014年

2
Jest + Jasmineを使用したまったく新しいセットアップで動作します。jasmine.DEFAULT_TIMEOUT_INTERVAL = 12000;すべてのテストに使用するグローバル構成ファイルを追加したところ、期待どおりに機能します。
イグナシオセグラ2017

23

これで、it関数の最後の引数として追加できるようになりました。

describe('my test', function(){
    it('works', function(done){
        somethingAsync().then(done);
    }, 10000); // changes to 10 seconds
});

11

Angularでは、これをdescribeブロックの外側に配置します。

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;

これは、.spec.tsファイル内のすべてのテストに適用されます


3

describeステートメントの後に置きます:

describe("A saves to DB", function() {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;


1

スパイしてみませんか setTimeout()か?

何かのようなもの:

var spy = spyOn(window, 'setTimeout').andCallFake(function (func, timeout) {
    expect(timeout).toEqual(2500);
    func();
});

setTimeOut(function () { ... }, 2500);
expect(spy).toHaveBeenCalled();

1
ありがとう。これらは統合テストであり、node.jsはしばしば遅い外部サービスを呼び出しています。
ブライアンロー

これは素晴らしいです、それはテストを実際のタイムアウトを待たせることなくタイムアウトをテストすることを可能にします
ギヨーム

この方法では、時間の経過を実行せず、すぐにfnを呼び出しますが、元のサイクルでは次のサイクルの前に呼び出すことはありません。
アンドレ・Werlang

0

私の場合、複数のテストケースがあり、前述のソリューションを使用している間、次のものを使用していました。

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    });

DEFAULT_TIMEOUT_INTERVALは最初のテストケースで更新されなかったので、これを追加する必要がありました。

  beforeAll(() => {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
  })

すべてのテストを正常に実行するために私のコードに。


-17

次のファイルでj $ .DEFAULT_TIMEOUT_INTERVALを10000に変更します:npm \ node_modules \ jasmine-core \ lib \ jasmine-core


テストが実行されるたびにライブラリがインストールされるシナリオには効果がありません。例:-クラウドでCIを実行しています。
domino_katrino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.