试图帮助一些朋友为他们的 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 是否会导致这些问题?
谢谢