私はジャスミン( 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の実行を待機させるにはどうすればよいですか?
ジャスミン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);
});
}
その場合、期待は失敗します。
@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);
});
Run()とwaitfor()を調べてください
具体的には、waitforを呼び出して、コールバックが何らかの方法で実行されたことを確認し(おそらく、ブール値をチェックとして使用しますか?)、その後、expectを実行できます。
runを使用すると、waitforが完了するまで待機できます。