Sinon Spy 无法使用 Javascript 致电或申请
Sinon Spy not working with Javascript call or apply
我正在尝试使用 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
组件中的 play
和 sendDone
函数:
play: function() {
console.log("play");
},
sendDone: function() {
this.dispatchEvent(new CustomEvent("rise-component-done", { "bubbles": true }));
}
page
组件已注册侦听此事件:
this.addEventListener("rise-component-done", this.handleDone);
有人知道解决方法吗?
谢谢。
因此,正如 Ben 所说明的那样,问题实际上与 call
方法根本无关。经过多次修改,我意识到我必须更改这一行:
playSpy = sinon.spy(demo, "play");
对此:
playSpy = sinon.spy(page.components[0], "play");
现在我的测试通过了。万岁!我只是希望它没有花费我一天的大部分时间来调试。
我正在尝试使用 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
组件中的 play
和 sendDone
函数:
play: function() {
console.log("play");
},
sendDone: function() {
this.dispatchEvent(new CustomEvent("rise-component-done", { "bubbles": true }));
}
page
组件已注册侦听此事件:
this.addEventListener("rise-component-done", this.handleDone);
有人知道解决方法吗?
谢谢。
因此,正如 Ben 所说明的那样,问题实际上与 call
方法根本无关。经过多次修改,我意识到我必须更改这一行:
playSpy = sinon.spy(demo, "play");
对此:
playSpy = sinon.spy(page.components[0], "play");
现在我的测试通过了。万岁!我只是希望它没有花费我一天的大部分时间来调试。