试图帮助一些朋友为他们的Javascript编写单元测试,但遇到了我以前从未遇到过的问题。他们在应用程序中非常简单地使用JStree - 通过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吗?
由于