簡體   English   中英

測試包含異步代碼的功能

[英]Testing for a function that contains asynchronous code

使用qUnit,我了解如果測試中包含異步代碼,那么如何使用asyncTest() ,但是如果您具有包含異步代碼的函數,該怎么辦?

換句話說,異步請求不在測試中,而只是被測試代碼的一部分。

以下面的代碼為例:

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

如何在測試中調用makeAjaxCall() ,然后對從ajax請求返回的data進行測試?

在這種情況下,您可以使用jQuery Global 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自己重新解析它們。 不理想,但我不知道另一種方式。

似乎沒有人在乎mockAjax ,所以最近我發現了一些更好的東西: sinonJS 您知道這個名為Fiddler的出色工具的功能autoResponse嗎? sinonJS允許您在客戶端執行相同的操作,這是一種Ajax旁路代理。 如果您有興趣查看示例,請告訴我 ...以便sinonJS可以在不訪問服務器的情況下響應任何ajax請求,如果您要模擬客戶端,並且要對JavaScript代碼進行單元測試,這就是一種魔術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM