試圖幫助一些朋友爲他們的Javascript編寫單元測試,但遇到了以前從未遇到的問題。他們在應用程序中使用JStree非常簡單 - 通過AJAX調用從服務器加載數據。使用Jasmine爲JSTree Stubbing AJAX響應
var loadHelpValues = function() {
$('#dhAttrValues').jstree({
json_data: {
ajax: {
type: 'get',
dataType: 'json',
url: function (node) {
if (node == -1) {
return "/Item/treeValue/showTreeRoots";
} else {
return "/Item/treeValue/showTreeChildren?parentId=" + node.attr('valueid') +"&rowId="+node.attr('rowid');
}
},
data: function(n) {
return "dept="+$('#dept').val()+"&attributeId="+$('#dhTitle').data('attributeid');
},
success: function(new_data, textStatus) {
return new_data;
},
error: function(XMLHttpRequest,textStatus,errorThrown) {
item.checkForSessionTimeoutAndRemoveErrors(XMLHttpRequest.responseText);
}
},
progressive_render: true,
progressive_unload: true
},
core: {html_titles:true},
themes: {theme:"apple", dots:false, icons:false},
plugins: ["themes","json_data"]
});
這工作得很好,但我在編寫Jasmine測試來驗證行爲時遇到了麻煩。我所擁有的是一些最小的假HTML,我將其稱爲此功能。我想嘲笑AJAX調用,以便我可以返回一些假數據並驗證它是否以合適的格式顯示在div中(是的 - 我知道這基本上是測試JSTree小部件,但是這樣我們就可以添加其他行爲並測試將來在這些節點上的點擊事件)
通常在Jasmine中,當我想要將AJAX請求斷開時,我可以將一些假數據放入我的代碼中 - 我可以只使用一個簡單的spyOn。
spyOn($, "ajax").andCallFake(function(params){
params.success(
[
{"data":"Solid", "attr": {"id":"dhValue521f6364fe334d21c3917da6","valueId":"521f6364fe334d21c3917da6","value":"Solid","title":"Solid","selectable":false},"state":""},
{"data":"Polka Dot","attr":{"id":"dhValue521f6364fe334d21c3917da8","valueId":"521f6364fe334d21c3917da8","value":"Polka Dot","title":"Polka Dot","selectable":false},"state":""},
]
)
});
但由於某些原因,這不能與JStree一起工作 - 它仍然繼續嘗試從我的單元測試中創建一個真正的AJAX調用。我甚至驗證了在JStree源代碼中它確實調用$ .ajax從服務器獲取數據,所以這個應該工作。嘗試幾乎所有可能的選擇,我可以想到和搜索到處。
有沒有人能夠做到這一點?或者能夠指出我的AJAX存根有什麼問題?是否事實上,JStree被編碼爲導致這些問題的JQuery Widget?
感謝