【问题标题】:Sinon Spy not working with Javascript call or applySinon Spy 无法使用 Javascript 调用或应用
【发布时间】:2015-03-31 14:17:14
【问题描述】:

我正在尝试使用sinon.spy 检查是否正在为组件调用play 函数。问题是间谍计数器没有更新,即使我已经确认我的组件的函数确实被调用了。

我已经追踪到使用 Javascript 的 call 函数:

handleDone: function(e) {
  for (var i = 0; i < this.components.length; i++) {
    if (this.components[i].element === e.target) {
      if (this.components[i].hasOwnProperty("play")) {
        // This won't trigger the spy.
        this.components[i]["play"].call(this.components[i].element);
      }
      break;
    }
  }
}

call 替换为apply 时会发生类似的情况。

[更新] 这是相关的测试:

var page = document.getElementById("page"),
  demo = document.getElementById("demo"),
  playSpy;

suiteSetup(function() {
  playSpy = sinon.spy(demo, "play");
});

suiteTeardown(function() {
  demo.play.restore();
});

suite("done", function() {
  test("rise-component-done fired from element with play property", function() {
    assert(playSpy.notCalled);  //true
    demo.sendDone();
    assert(playSpy.calledOnce); //false
  });
});

还有demo 组件中的playsendDone 函数:

play: function() {
  console.log("play");
},

sendDone: function() {
  this.dispatchEvent(new CustomEvent("rise-component-done", { "bubbles": true }));
}

page 组件已注册以侦听此事件:

this.addEventListener("rise-component-done", this.handleDone);

有人知道解决方法吗?

谢谢。

【问题讨论】:

  • 你能举一个例子来说明你是如何做play函数的间谍的吗?也许是整个测试,看看它是否可能来自那里。
  • 我已经使用call 进行了快速测试,它似乎可以工作:codepen.io/anon/pen/RNOwvB?editors=101
  • 我已经更新了更多细节。

标签: javascript unit-testing sinon


【解决方案1】:

因此,正如 Ben 所说明的那样,问题实际上与 call 方法根本无关。经过多次修补,我意识到我必须改变这一行:

playSpy = sinon.spy(demo, "play");

到这里:

playSpy = sinon.spy(page.components[0], "play");

现在我的测试通过了。万岁!我只是希望它没有花费我一天的大部分时间来调试。

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 2017-01-07
    • 2018-01-25
    • 2017-02-12
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2021-11-16
    • 2019-06-22
    相关资源
    最近更新 更多