web-dev-qa-db-ja.com

Sinon.jsスタブから元の関数を呼び出す

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?

});

私が抱えている問題は元の関数の実行であるため、アプリケーションは同じように動作します。何か案が?

23
johnkchiu

クロージャを使用できます。例えば:

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

21
psquared

Sinonは、元の関数への参照を スタブのwrappedMethodプロパティ に格納します(ドキュメントは2020年に最近追加されました)。これは、偽のメソッドで呼び出すことができます。

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);
});
1
GOTO 0