0

我正在使用sinon.js / qunit编写函数测试。我编写测试的页面工作正常,但是在测试中使用 sinon 伪造服务器响应时,我无法让 jstree 对象加载其初始数据。

为了确保我正在测试的页面和我正在编写的测试使用相同的响应数据,我创建了一个名为change_dialog_fixture我加载的 JavaScript 对象夹具,以代替从服务器返回的数据。您可以在下面的调用中看到这一点getJSON

    $.getJSON(axes_url, function(data) {
        //ANALYSIS_PAPER.change_data = data;
        ANALYSIS_PAPER.change_data = change_dialog_fixture;
        hide_throbber(); // sinon confirms this is called
        create_change_dialog();
        console.log(ANALYSIS_PAPER.change_data); // prints
    });

通过单步执行代码,我可以看到对于两个页面(工作页面和测试页面),被操作到 jstree 对象(由函数)中的 DOM 元素create_change_dialog返回之前不会加载其数据。 getJSON

返回后getJSON,工作页面“聚焦”创建的树并加载给定的 JSON 数据ANALYSIS_PAPER.change_data以创建 jstree 结构。在 qunit 测试页面上,这不会发生。DOM 元素仍然是一个 jstree 对象,但该元素是完全空的。

正如包含代码中的注释所示,hide_throbber被调用(我正在使用sinon spies测试它)并console.log打印该语句。不会引发异常,也不会指示错误。失败是完全沉默的。

我认为这可能与时间有关,所以我做了我的 qunit 测试 aasyncTest并添加start();到传递给的回调函数中,getJSON但这并没有改变任何东西。我也采取了不同的方法并编辑了fakeServerwith server.autoRespond = true,但这也没有解决问题。

任何关于进一步测试运行的建议或关于可能导致此问题的想法的任何建议都非常受欢迎。谢谢。

4

1 回答 1

1

问题是,由于 jstree 是动画的,所以树实际上是异步加载的。因为动画window.setTimeout的核心是使用,而 sinon 可以使用它的来伪造这个函数fake timers,添加一些click.tick语句解决了这个问题。例如:

$loadTreeButton.trigger("click");
this.clock.tick(1000);
equal(partOfTheTree.length, 1, "Component 1 loaded");

jstree 的核心文档页面上列出的loaded.jstree函数通过暗示 jstree 正在异步加载,让我朝着正确的方向前进。

于 2013-04-15T17:32:23.340 回答