1

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

谢谢

4

1 回答 1

0

查看jasmine-ajax,这在较低级别模拟了 XHR 请求,并且应该可以工作。完整的文档在这里

于 2014-01-26T06:41:46.177 回答