Как при использовании Sinon заменить функцию-заглушку в экземпляре-заглушке?

Если я создал экземпляр var a = sinon.createStubInstance(MyContructor).

Как я могу заменить одну из заглушенных функций, например var stub = sinon.stub(object, "method", func);.

Основная причина, по которой я это делаю, заключается в том, что я хочу добиться обходного пути с несколькими обратными вызовами, как callback-on-a-single-stubbed-function">это упоминалось


person StevenR    schedule 13.10.2015    source источник


Ответы (4)


Упомянутый вами метод (sinon.stub(object, "method", func)) был доступен в версии 1.x и согласно документации выполнял следующие действия:

Заменяет object.method на func, завернутый в шпиона. Как обычно, object.method.restore(); можно использовать для восстановления исходного метода.

Однако, если вы используете sinon.createStubInstance(), все методы уже заглушены. Это означает, что вы уже можете делать определенные вещи с заглушенным экземпляром. Например:

function Person(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
}
Person.prototype.getName = function() {
  return this.firstname + " " + this.lastname;
}

const p = sinon.createStubInstance(Person);
p.getName.returns("Alex Smith");

console.log(p.getName()); // "Alex Smith"

Если вы действительно хотите заменить заглушку другим шпионом или заглушкой, вы можете назначить свойство новой заглушке или шпиону:

const p = sinon.createStubInstance(Person);
p.getName = sinon.spy(function() { return "Alex Smith"; }); // Using a spy
p.getName = sinon.stub(); // OR using a stub

В Sinon.js 2.x и выше еще проще заменить функцию-заглушку с помощью функции callsFake():

p.getName.callsFake(function() { return "Alex Smith"; });
person g00glen00b    schedule 13.10.2015
comment
Перед вызовом a.method = sinon.stub() важно вызвать a.method.restore(). - person Ajitesh; 13.05.2017
comment
Проголосовал за этот ответ, так как этот ответ привел меня на правильный путь. Хотя с тех пор, как на этот вопрос был дан ответ, sinon.stub(object, "method", fn) устарел. Теперь мы можем использовать sinon.stub(object, "method").callsFake(function() { // do stuff }); См. здесь Изменить: фиксированный URL - person Phil D.; 11.10.2017
comment
@ФилД. Вы правы, но сам вопрос требует sinon.stub(object, "method", fn), поэтому я не буду включать эту информацию в сам ответ. - person g00glen00b; 11.10.2017
comment
@ g00glen00b, да, но каждому, кто приходит сюда, требуется дополнительная итерация, чтобы вернуться к коду, узнать, что третьего аргумента нет, вернуться сюда за комментариями или копнуть глубже. Я думаю, что всем будет полезен раздел обновлений в ответе. - person Kirill Slatin; 22.09.2020
comment
@KirillSlatin В исходном состоянии этого ответа и вопроса мне было трудно его интегрировать и при этом сохранить ответ по теме вопроса. Однако я попытался переписать ответ, чтобы интегрировать эту часть в свой ответ. - person g00glen00b; 22.09.2020
comment
@ g00glen00b спасибо за обновление! Это выглядит хорошо для меня. Вы также можете добавить раздел Обновление, поскольку с тех пор, как вы ответили в 2015 году, API/библиотека развились, и теперь в предлагаемом решении есть нюанс. Это правильно понимается читателями и традиция на SO - person Kirill Slatin; 23.09.2020

После заглушки всего объекта с помощью sinon.createStubInstance(MyConstructor) или sinon.stub(obj) вы можете заменить заглушку, только назначив новую заглушку свойству (как описано @g00glen00b) или восстановив заглушку перед повторной заглушкой.

var a = sinon.createStubInstance(MyConstructor);
a.method.restore();
sinon.stub(object, "method", func);

Преимущество этого в том, что вы все еще можете вызвать a.method.restore() после ожидаемого поведения.

Было бы удобнее, если бы в Stub API был метод .call(func) для переопределения функции, вызываемой заглушкой постфактум.

person flungo    schedule 30.10.2016

Нет необходимости перезаписывать a.method, вместо этого мы можем напрямую использовать callsFake в a.method:

const a = sinon.createStubInstance(MyContructor);
a.method.callsFake(func);
person Jan Molak    schedule 09.10.2018
comment
Использовал этот подход и работает как шарм. Это проще и чище! - person Saxophonist; 01.04.2019
comment
Отлично, рада, что вам понравилось! - person Jan Molak; 02.04.2019

Еще 1 способ заглушить метод из 2.0+

sinon.stub(object, "method").callsFake(func);

object.method.restore()

person Srini    schedule 02.04.2018