Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Sinon沙箱恢复spied/stubbed功能_Javascript_Sinon_Stub_Monkeypatching_Spy - Fatal编程技术网

Javascript 使用Sinon沙箱恢复spied/stubbed功能

Javascript 使用Sinon沙箱恢复spied/stubbed功能,javascript,sinon,stub,monkeypatching,spy,Javascript,Sinon,Stub,Monkeypatching,Spy,Sinon沙盒(或Sinon实例)从外部传递到脚本范围。内部函数(不是方法)可以选择使用Sinon沙盒进行监视/存根 Sinon在这里参与了某种猴子补丁(而不是单元测试)。Sinon沙盒概念非常适合用例——直到现在 我从函数spy不能被方法spy取代这一事实出发。这不是一个完美的场景,但设计无法改变 const originalCallback = callback; callback = sinonSandbox.spy(callback); thirdPartyFn(callback);

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

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

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

const originalCallback = callback;

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

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

当恢复沙盒以恢复间谍功能时,如何通知应用程序?“还原”事件上是否有要启动的钩子?是否有第三方Sinon扩展可以提供帮助?

我想模拟/存根恢复功能:

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

事件对象只是您的全局发布/子模块或类似模块。

看起来,Sinon没有沙盒还原通知机制。由于
sandbox.restore()

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

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

我希望避免这种情况,但是的,看起来这一切都是关于猴子修补术。顺便说一句,我认为应该是
originalRestore.call(sinonSandbox)
(不确定参数,但看起来
restore
没有参数)。