2016-04-29 64 views
0

這是我想測試代碼:如何使用茉莉測試json函數內部函數?

function loadNotification(searchOption, searchKey) { 
    var url = '@URLs.API.Notifications.Past' + '?searchOption=' + searchOption + '&searchValue=' + searchKey; 
    $.getJSON(url) 
     .done(function (nData) { 
     //some code here 
     }) 
     .fail(function (jqXHR, status, error) { 
     showError('There was an error while fetching the records. Please try after some time. (' + jqXHR.status + ':' + jqXHR.statusText + ')'); 
     }); 
} 

使用茉莉,我怎麼測試,如果JSON文件損壞或者不是?我正在考慮使用。完成,儘管,但我不確定是否有可能。我對json瞭解不多。誰能幫我嗎?

回答

0

當測試AJAX請求(以及類似的,獲取json文件等)時,檢查代碼是否可以處理完成和失敗總是一個好主意。您還應該模擬您測試的數據,不要過多地依賴應用程序中的實際端點或它嘗試下載的文件。您希望測試儘可能快地運行。

使用茉莉,你可以做幾件事情:使用間諜

spyOn是可以存根給定函數,並跟蹤傳遞給它什麼樣的參數的函數,可以看到還有什麼其他函數調用它,甚至在執行代碼時返回一個特定的值。

您可以使用間諜來查看$ .get請求會發生,然後您可以說返回一個特定的值,並繼續測試該程序。

使用茉莉花阿賈克斯插件

這是我喜歡在我的測試中使用。茉莉花有一個非常漂亮的插件ajax.js。它簡化了對任何Ajax功能的測試。我喜歡做的是嘲笑實際的請求,所以當你的代碼嘗試獲取文件/響應時,代碼將忽略實際的調用並模擬它,返回可以指定的假數據。

在我開始之前,我還希望在一個單獨的函數中使用我的ajax方法,它只會返回一個承諾。它更容易閱讀/測試/維護,所以例如,你可以把它改寫想:如果您加載虛擬數據測試應用

this.loadNotificationCall = function(searchOption, searchKey) { 
    var url = '@URLs.API.Notifications.Past' + '?searchOption=' + searchOption + '&searchValue=' + searchKey; 
    return $.getJSON(url) 
} 

this.loadNotification() { 
    return this.loadNotificationCall() 
     .done(function (nData) { 
      //some code here 
     }) 
     .fail(function (jqXHR, status, error) { 
      showError('There was an error while fetching the records. Please try after some time. (' + jqXHR.status + ':' + jqXHR.statusText + ')'); 
     }); 
} 

,我想你想到Ajax請求的文件有一個特定的路徑。

你在看什麼,你可以從

'@URLs.API.Notifications.Past' + '?searchOption=' + searchOption + '&searchValue=' + searchKey; 

輸出比方說,這最基本的,默認版本的類似

//'someapi?searchOption=1&searchValue=abc' 

該URL必須完全匹配到什麼將你的應用程序會嘗試聯繫。檢查你的調試/提琴手,看看是什麼以防萬一。如果它不匹配(包括它要發送的數據),模擬將失敗,測試將超時。該錯誤通常看起來像Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

一旦你得到這個權利,你可以嘲笑那個URL在下面的例子:

describe('when user gets the data', function() { 

var sut = null; 
var testCall = null; 
var dummyData = { 
    name: 'Jon Snow' 
}; 
beforeEach(function() { 
    jasmine.Ajax.install(); 
    jasmine.Ajax.stubRequest("someapi?searchOption=1&searchValue=abc").andReturn({ 
      responseText: JSON.stringify(dummyData) 
    }); 

    sut = new yourApplication(); 
    testCall = sut.loadNotification(); 
}); 

afterEach(function() { 
    jasmine.Ajax.uninstall(); 
}); 

// actual tests here 

}); 

我也敢肯定,你可以在這些模擬的URL中使用通配符,所以這也應該是有效的:​​

所以現在發生的是,如果你測試一些將用$ .get調用你的方法的東西,請求不會發生在你的服務器上,而是它會被模擬,而我們的假人數據將被返回。在這個例子中它與name: 'Jon Snow'

一個簡單的對象現在,你想有一個測試,看起來是這樣的:

it('should populate name', function(done) { 
    testCall 
     .done(function() { 
      expect(sut.name).toEqual('Jon Snow'); 
      done(); 
     }); 
}); 

您通過完成參數的測試,所以它不會結束,直到通話結束。如果您在瀏覽器中進行調試,則會看到文件中的代碼將進入完成方法並繼續工作,因爲這是真正的請求。 done(nData)中的數據將成爲name: Jon Snow的虛擬對象。

如果你想測試一個失敗的代碼,你可以添加到AJAX插件一些額外的設置:

jasmine.Ajax.stubRequest("someapi?searchOption=1&searchValue=abc").andReturn({ 
    status: 500, 
    responseText: "{}" 
}); 

我希望我沒有這個來煩你了,我知道有simplier方法(比如只是在'ajax'上執行$ .spy並看到最近的呼叫等,但我喜歡我的方法,工作得很好,我可以測試多個呼叫,鏈接呼叫以及更多很酷的場景。

+0

謝謝@kasperoo的詳細答覆,我會繼續前進,並嘗試與我的測試,我很感激!希望,我可以得到它的工作 –

+0

如果我不能改變功能ajax調用(它是由另一個開發人員編寫的),我可以繼續使用上面介紹的代碼對它進行嘲弄嗎? –

+0

正確,鑑於承諾是返回 – kasperoo

相關問題