Вызов исходной функции из Sinon.js Stub

Я пытаюсь перехватить вызов с помощью 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?

});

У меня проблема с выполнением исходной функции, поэтому мое приложение ведет себя так же. Есть идеи?


person johnkchiu    schedule 28.03.2014    source источник


Ответы (2)


Вы можете использовать замыкание. Например:

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

person psquared    schedule 28.03.2014
comment
Спасибо! Нашел этот комментарий в Sinonjs github, который также объяснил это. - person johnkchiu; 30.03.2014
comment
Благодарю. Я думаю, вам может понадобиться сделать var originalFoo = obj.foo.bind(obj) - person Eliot; 09.09.2017

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>

Таким образом, код ОП будет таким:

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);
});
person GOTO 0    schedule 13.07.2019