使用 Sinon 沙盒恢复 spied/stubbed 功能

Restore spied/stubbed function with Sinon sandbox

一个 Sinon 沙箱(或 sinon 实例)从外部传递到脚本范围。内部函数(不是方法)可以选择 spied/stubbed 与 Sinon 沙箱。

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

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

const originalCallback = callback;

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

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

恢复sandbox时如何通知app恢复spied功能?在 'restore' 事件上是否有要启动的挂钩?是否有可能有帮助的第三方 Sinon 扩展?

我会 mock/stub 恢复功能 :

var originalRestore = sinonSandbox.restore;

sinonSandBox.restore = () => {
  originalRestore();
  // insert code here
};

最初,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
});

事件对象只是您的全局 pub/sub 模块或类似的东西。

看起来,Sinon 没有沙盒恢复通知机制。由于 sandbox.restore() 的工作是 to call restore method on each faked function,我以修补 fake 自己的 restore 作为最合适的解决方案结束:

const originalCallback = callback;
callback = sinonSandbox.spy(callback);

const originalRestore = callback.restore;
callback.restore = function (...args) {
  originalRestore.apply(this, args);
  thirdPartyFn(originalCallback);
}