當測試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並看到最近的呼叫等,但我喜歡我的方法,工作得很好,我可以測試多個呼叫,鏈接呼叫以及更多很酷的場景。
謝謝@kasperoo的詳細答覆,我會繼續前進,並嘗試與我的測試,我很感激!希望,我可以得到它的工作 –
如果我不能改變功能ajax調用(它是由另一個開發人員編寫的),我可以繼續使用上面介紹的代碼對它進行嘲弄嗎? –
正確,鑑於承諾是返回 – kasperoo