Javascript 使用Sinon沙箱恢复spied/stubbed功能
Sinon沙盒(或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沙盒概念非常适合用例——直到现在
我从函数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
没有参数)。