web-dev-qa-db-ja.com

jasmine.js expect()は非同期コールバック内では機能しません

私はジャスミン( http://pivotal.github.com/jasmine/ )に精通していて、かなり困惑する何かを見つけました:

it("should be able to send a Ghost Request", function() {
  var api = fm.api_wrapper;

  api.sendGhostRequest(function(response) {
    console.dir('server says: ', response);
  });

  expect(true).toEqual(false);
});

期待どおりに失敗します。

ただし、コールバック内でexpect呼び出しを移動します。

it("should be able to send a Ghost Request", function() {
  var api = fm.api_wrapper;

  api.sendGhostRequest(function(response) {
    console.dir('server says: ', response);
    expect(true).toEqual(false);
  });
});

どういうわけか合格:O

デバッグ後:api.sendGhostRequest()は非同期ajaxリクエストを実行し、リクエストが完了する前にjasmineが急いで通過します。

したがって、質問:

テスト結果を確認する前に、ジャスミンにajaxの実行を待機させるにはどうすればよいですか?

18
Val Redchenko

ジャスミン2の編集

Jasmine 2では、非同期テストがはるかに簡単になりました。非同期コードを処理する必要のあるテストは、テストの完了を示すコールバックを使用して記述できます。 Jasmine 2 docs ヘッダーの下非同期サポートを参照してください

it('should be able to send a ghost request', (done) => {
    api.sendGhostRequest((response) => {
        console.log(`Server says ${response}`);
        expect(true).toEqual(false);
        done();
    });
});

ジャスミン1

-のwaitsFor()runs()を見てください Jasmineサイト ヘッダーの下非同期サポート

Runとwaitsforを使用すると、Jasmineはajax呼び出しが終了するかタイムアウトするまで待機する必要があります。

コードは次のようになります。

it("should be able to send a Ghost Request", function() {
    runs(function() {
        api.sendGhostRequest(function(response) {
            console.dir('server says: ', response);
            flag = true;
        });
    }, 500);

    waitsFor(function() {
        return flag;
    }, "Flag should be set", 750);

    runs(function() {
        expect(true).toEqual(false);
    });
}

その場合、期待は失敗します。

14
halfs13

@pkopacがコメントしたように、runs()waitsFor()はv2で非推奨になり、文書化されているようにdone()コールバックを使用するようになりました: https:// jasmine。 github.io/2.0/introduction.html#section-Asynchronous_Support

it("should be able to send a Ghost Request", function(done) {
    var api = fm.api_wrapper;

    var success = function(response) {
        console.dir('server says: ', response);
        expect(response).toEqual('test response')
        done();
    };

    api.sendGhostRequest(success);
});
4
ptim

Run()とwaitfor()を調べてください

具体的には、waitforを呼び出して、コールバックが何らかの方法で実行されたことを確認し(おそらく、ブール値をチェックとして使用しますか?)、その後、expectを実行できます。

runを使用すると、waitforが完了するまで待機できます。

非同期ジャスミンドキュメント

1
Ben McCormick