19

私は Jasmine ( 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 はリクエストが完了する前に急いで通り過ぎます。

したがって、質問:

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

4

3 に答える 3

15

Jasmine 2 の編集

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

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

ジャスミン 1

Jasmine サイトのヘッダーAsynchronous Supportの下にあるwaitsFor()runs( )を見てください。

run と waitfor を使用すると、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);
    });
}

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

于 2013-02-28T17:34:42.270 に答える
1

runs() と waitfor() を調べる

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

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

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

于 2013-02-28T17:36:18.387 に答える