Подтвердить что ты не робот

Понимание Sinon.js yield(), yields() и callsArg()

В чем разница между

  • stub.yield([arg1, arg2, ...])
  • spy.yields([arg1, arg2, ...])
  • stub.callsArg(index)

в библиотеке Sinon.js?

stub.yield() - это единственное, что я смог понять:

  stub = sinon.stub(API, 'call_remote');
  callback = sinon.spy();
  API.call_remote('help', callback);
  @stub.yield( "solution!" );
  @stub.calledOnce.should.be.true;
  @callback.calledOnce.should.be.true;
  @callback.args[0][0].should.eql( "solution!" );

Как было проверено с помощью if.js, все утверждения будут проходить.

Существуют ли аналогичные тестовые шаблоны для stub.yields() и stub.callsArg(index)?

В документации не приводятся примеры, чтобы прояснить эти два других метода, но мне любопытно их.

4b9b3361

Ответ 1

Я считаю, что методы, описанные в документации, выглядят следующим образом:

  • spy.yield
  • stub.yields
  • stub.callsArg

Основное различие между yields и callsArg можно найти в документации по синону для выходов:

Если метод принимает более одного обратного вызова, вам нужно использовать вызовыArg, чтобы заглушка вызывала другие обратные вызовы, чем первая.

yields вызовет первый аргумент функции, с которым он сталкивается с любыми необязательными аргументами, которые вы ему предоставляете. callsArg будет пытаться вызвать аргумент функции в указанном индексе внутри этого объекта вызова arguments и не передает ему никаких аргументов (вы можете использовать callArgWith для этого поведения).

spy.yield очень похож на stub.yields, за исключением того, что он является частью API-шпиона и он вызывает все обратные вызовы, переданные ему.

Вот несколько примеров, демонстрирующих различия (простите меня, если примеры немного надуманны):

Урожайность:

var fn = sinon.expectation.create().withArgs(1, 2);
var stub = sinon.stub().yields(1, 2);
stub(fn);
fn.verify();

CallsArg:

var f1 = sinon.expectation.create().never();
var f2 = sinon.expectation.create().once();
var stub = sinon.stub().callsArg(1);
stub(f1, f2);
f1.verify();
f2.verify();

Выход:

var f1 = sinon.expectation.create().once();
var f2 = sinon.expectation.create().once();
var stub = sinon.stub().yield();
stub(f1, f2);
f1.verify();
f2.verify();