我试图拦截与Sinon.js的呼叫,这样我就可以进行一些记录,然后执行原始呼叫。我没有看到用sinon.spy()做到这一点的方法,但我想我可以用sinon.stub()做到这一点。
我提供了一个自定义功能:
sinon.stub(servicecore.ServiceWrapper.prototype, '_invoke', function(method, name, body, headers, callback) {
console.log('---- ServiceWrapper._invoke called! ----');
// How do I call the original function?
});
我遇到的问题是执行原始函数,所以我的应用程序行为相同。有什么想法吗?
答案 0 :(得分:20)
你可以使用一个闭包。例如:
var obj = {
foo: function () {
console.log('foo');
}
};
var stub = (function () {
var originalFoo = obj.foo;
return sinon.stub(obj, 'foo', function () {
console.log('stub');
originalFoo();
});
}());
答案 1 :(得分:0)
Sinon在存根的wrappedMethod
属性中存储对原始函数的引用。可以在假方法中调用它。
sinon.stub(Array.prototype, 'sort').callsFake(
function () {
console.log(`sorting array ${this}`);
return Array.prototype.sort.wrappedMethod.apply(this, arguments);
}
);
const array = ['C', 'A', 'B'].sort();
console.log(`sorted array is ${array}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.3.2/sinon.min.js"></script>
因此,OP的代码为:
sinon.stub(servicecore.ServiceWrapper.prototype, '_invoke').callsFake(function(method, name, body, headers, callback) {
console.log('---- ServiceWrapper._invoke called! ----');
return servicecore.ServiceWrapper.prototype._invoke.wrappedMethod.apply(this, arguments);
});