Ответ 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();