从Sinon.js Stub调用原始函数

joh*_*hiu 21 sinon

我正在尝试拦截与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?

});
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是执行原始函数,所以我的应用程序行为相同.任何的想法?

psq*_*red 21

你可以使用一个闭包.例如:

var obj = {
    foo: function () {
        console.log('foo');
    }
};

var stub = (function () {
    var originalFoo = obj.foo;
    return sinon.stub(obj, 'foo', function () {
        console.log('stub');
        originalFoo();
    });
}());
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

  • 谢谢.我想你可能需要做`var originalFoo = obj.foo.bind(obj)` (2认同)

GOT*_*O 0 11

SinonwrappedMethod在存根属性中存储了对原始函数的引用(文档是最近在 2020 年添加的)。这可以在 fake 方法中调用。

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}`);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.3.2/sinon.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

所以 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);
});
Run Code Online (Sandbox Code Playgroud)