使用Sinon沙箱恢复间谍/存根功能

时间:2016-06-01 01:28:11

标签: javascript sinon stub monkeypatching spy

Sinon沙箱(或sinon实例)从外部传递到脚本范围。内部函数(不是方法)可以选择使用Sinon沙箱进行间谍/存根。

Sinon参与了某种猴子修补(不是单元测试).Sinon沙盒概念非常适合用例 - 直到这一刻。

我从函数间谍无法用方法间谍取代的事实出发。这不是一个完美的场景,但设计无法改变。

const originalCallback = callback;

callback = sinonSandbox.spy(callback);
thirdPartyFn(callback);

// how can this be achieved?
// sinonSandbox.onRestore(() => thirdPartyFn(originalCallback));

如何在恢复沙箱恢复间谍功能时通知应用程序?是否有一个钩子可以启动恢复'事件?是否有可能有帮助的第三方Sinon扩展?

3 个答案:

答案 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);
}