使用 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);
}
一个 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);
}