2013-03-28 48 views
1

使用qUnit,如果在測試中有異步代碼,我知道如何使用asyncTest(),但是如果您有一個包含異步代碼的函數呢?測試包含異步代碼的函數

換句話說,異步請求不在測試範圍內,而僅僅是正在測試的代碼的一部分。

就拿這個代碼:

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

我怎麼能說一個測試中makeAjaxCall(),然後運行對從Ajax請求返回的data測試?

回答

1

在這種情況下,您可以使用jQuery Global Ajax Event Handlers。在調用之前綁定它,在完成測試後解除綁定,可能通過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(); 
}); 

注意的是,全球處理器do not have access to the parsed contents,你必須使用JSON.parse自己重新分析他們。不理想,但我不知道另一種方式。

+0

這個答案似乎應該工作,但如果異步事件不是ajax請求呢?我唯一的選擇是否會從回調中手動進行事件觸發? – twiz 2013-03-28 04:34:58

+0

我這麼認爲。你需要在異步進程中有一些鉤子並確定它已經完成。我不知道任何JavaScript構造都可以爲每種類型的異步操作執行此操作。您可以通過重寫實現並在幕後執行一些魔術來顯然創建自己的像window.setTimeout這樣的衆所周知的實例,但可以說更容易進行回調。 $ .Deferred可以幫助實現清潔。 – syazdani 2013-03-28 13:50:43

0

似乎沒人關心mockAjax,所以我最近發現了更好的東西:sinonJS! 你知道這個奇妙的工具Fiddler的功能autoResponse嗎?sinonJS允許您在客戶端執行相同的操作,它是一種ajax旁路代理。 如果你有興趣看到一個例子,讓我知道 ...所以sinonJS可以在不訪問服務器的情況下響應任何ajax請求,如果你想模擬你的客戶端,如果你想單元測試你的javascript碼。