Sinon沙箱(或sinon
实例)从外部传递到脚本范围。内部函数(不是方法)可以选择使用Sinon沙箱进行间谍/存根。
Sinon参与了某种猴子修补(不是单元测试).Sinon沙盒概念非常适合用例 - 直到这一刻。
我从函数间谍无法用方法间谍取代的事实出发。这不是一个完美的场景,但设计无法改变。
const originalCallback = callback;
callback = sinonSandbox.spy(callback);
thirdPartyFn(callback);
// how can this be achieved?
// sinonSandbox.onRestore(() => thirdPartyFn(originalCallback));
如何在恢复沙箱恢复间谍功能时通知应用程序?是否有一个钩子可以启动恢复'事件?是否有可能有帮助的第三方Sinon扩展?
答案 0 :(得分:1)
我模拟/存根恢复功能:
var originalRestore = sinonSandbox.restore;
sinonSandBox.restore = () => {
originalRestore();
// insert code here
};
答案 1 :(得分:1)
最初,sinon不发布任何事件或提供任何钩子,但你可以创建一个:
var spyInstance = sinonSandbox.spy(callback);
(function (original) {
spyInstance.restore = function() {
original.apply(this, arguments); // call the original restore function
events.publish("sinon", "restore-end"); // publish the event to decouple this module from receiving module
}
})(spyInstance.restore);
然后,在另一个模块的某个地方:
events.subscribe("sinon", "restore-end", function() {
// call some code to execute when the sinon spy is restored
});
events对象只是你的全局pub / sub模块或类似的东西。
答案 2 :(得分:0)
看起来,Sinon没有沙盒恢复通知机制。由于$('#inputid').focusout(function() {
// slider destroy and create as Shailesh showed
});
上的sandbox.restore()
作业to call restore
method each faked function,我最终修补了伪造的restore
作为最合适的解决方案:
const originalCallback = callback;
callback = sinonSandbox.spy(callback);
const originalRestore = callback.restore;
callback.restore = function (...args) {
originalRestore.apply(this, args);
thirdPartyFn(originalCallback);
}