【问题标题】:Calling original function from Sinon.js Stub从 Sinon.js Stub 调用原始函数
【发布时间】:2014-05-07 23:44:01
【问题描述】:

我正在尝试使用 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?

});

我遇到的问题是执行原始函数,所以我的应用程序的行为相同。有什么想法吗?

【问题讨论】:

    标签: sinon


    【解决方案1】:

    你可以使用闭包。例如:

    var obj = {
        foo: function () {
            console.log('foo');
        }
    };
    
    var stub = (function () {
        var originalFoo = obj.foo;
        return sinon.stub(obj, 'foo', function () {
            console.log('stub');
            originalFoo();
        });
    }());
    

    JSFiddle

    【讨论】:

    • 谢谢!在Sinonjs github 中找到了这条评论,它也解释了它。
    • 谢谢。我想你可能需要做var originalFoo = obj.foo.bind(obj)
    【解决方案2】:

    Sinon 将原始函数的引用存储在 wrappedMethod property of the stub 中(文档是在 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}`);
    <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);
    });
    

    【讨论】:

      猜你喜欢
      • 2019-11-24
      • 1970-01-01
      • 2014-06-18
      • 2021-09-04
      • 1970-01-01
      • 2016-10-11
      • 2020-05-23
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多