1

qUnit では、asyncTest()テスト内に非同期コードがある場合の使用方法は理解できますが、非同期コードを含む関数がある場合はどうなるでしょうか?

つまり、非同期要求はテスト内にはなく、単にテスト対象のコードの一部です。

たとえば、次のコードをご覧ください。

function makeAjaxCall(){
    $.get('/mypage', {}, function(data){
        // Do something with `data`
    },'json');
}

テスト内で呼び出して、ajax リクエストから返された でmakeAjaxCall()テストを実行するにはどうすればよいですか?data

4

2 に答える 2

1

この状況では、 jQuery グローバル Ajax イベント ハンドラーを使用できます。呼び出す前にバインドし、テストが終了したら、おそらく Qunit のモジュール メソッドを介してバインドを解除します。

(未テスト) のようなもの:

asyncTest(function() {
  expect(1);

  $(document).ajaxSuccess(function(e, xhr, settings) {
     var jsonRep = JSON.parse(xhr.responseText);
     // assert on jsonRep
     //ok(true);
  });
  $(document).ajaxError(function(e) {
     ok(false);
  });
  $(document).ajaxComplete(function() {
     start();

     $(document).unbind('ajaxSuccess ajaxError ajaxComplete');
  });

  makeAjaxCall();
});

グローバル ハンドラは解析されたコンテンツにアクセスできないため、 JSON.parse を使用して自分で再解析する必要があることに注意してください。理想的ではありませんが、別の方法を知りません。

于 2013-03-28T03:26:44.567 に答える
0

誰もmockAjaxを気にしていないように見えるので、最近、より良いものを見つけました: sinonJS ! Fiddlerという素晴らしいツールの autoResponse 機能をご存知ですか? sinonJS を使用すると、クライアント側で同じことを行うことができます。これは一種の ajax バイパス プロキシです。例を見ることに興味がある場合は、私に知らせてください...それで、sinonJS はサーバーにアクセスせずに任意の ajax リクエストに応答できます。クライアントをモックしたい場合、JavaScript コードを単体テストしたい場合、これは一種の魔法です。

于 2013-04-08T16:15:46.150 に答える