2013-07-10 35 views
2

在源代碼中,我有一個getJSON調用,在以下結構中有兩個成功回調。無法窺探茉莉花單元測試中ajax的交錯成功回調

的源代碼進行測試:

jsonMakeLineOrderData = $.getJSON(url, jsonData, 
            function (data) { 
             console.log("Inside 1st callback"); 
             //… some other statement 
            }).success(function (data) {  // line# 1 
              console.log("Inside 2nd callback"); 
              //… some other statement 
             }); 

我用的茉莉測試框架來測試這一呼籲的成功塊。

爲了僞造/模擬ajax調用,我使用了spyOn實用程序。

我的茉莉花測試規範:

it ("Test Function",function(){ 
    var data = <json_data>; 
    var d; 
    spyOn($, "ajax").andCallFake(function(params) { 
     params.success(data);   // line# 2 
     d = $.Deferred(); 
     d.resolve(data); 
     return d.always(); 
    }); 
}); 

在上面的例子我能考第一,但回調無法測試第二個回調。

由於測試規範中的第2行,第1個回調正在執行。

我曾嘗試使用jQuery延遲的實例來執行第二個回調,但它拋出「類型錯誤:$ .getJSON(...)的成功不是一個函數」錯誤,如果我改變 .success ()聲明到 .done()在第1行的源文件中測試用例工作正常,但我無法使其與 .success()一起工作,但不幸我不想改變源文件,所以我必須使用 .success()

如果有人有任何解決方案,請讓我知道。

在此先感謝。

回答

0

你必須返回一個函數,將這樣調用回調:

it ("Test Function",function(){ 
    var data = <json_data>; 
    spyOn($, "getJSON").andReturn({success: function(c){c(data)}}); 
}); 

爲了方便AJAX測試中,我會建議sinonJS其中有一個簡單的方法來嘲笑與fake server阿賈克斯。

+0

我已經使用了與您建議的相同的語法 – Learner

+0

謝謝Andreas的迴應。 我已經使用了與以下提供的實際數據相同的語法。 spyOn($,「getJSON」)。return({success:function(c){c(testData)}}); 但是得到以下錯誤 _italic_ TypeError:spyOn(...)。return不是一個函數 我可能會犯一些錯誤,但我不確定我在做錯什麼。 – Learner

+0

我的錯''和'返回''不只是'返回',更新了我的答案。 –