【问题标题】:jstree not properly initialized when used with sinon.js与 sinon.js 一起使用时,jstree 未正确初始化
【发布时间】:2013-03-31 04:55:23
【问题描述】:

我正在使用 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 返回后,工作页面“聚焦”创建的树并加载ANALYSIS_PAPER.change_data 中给出的 JSON 数据以创建 jstree 结构。在 qunit 测试页面上,这不会发生。 DOM 元素仍然是一个 jstree 对象,但该元素是完全空的。

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

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

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

【问题讨论】:

    标签: jquery jstree qunit sinon


    【解决方案1】:

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

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

    jstree's core documentation page 中列出的 loaded.jstree 函数暗示 jstree 正在异步加载,这让我朝着正确的方向前进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2012-06-17
      • 2022-01-22
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多