Проверка вызова функции и проверка аргументов с помощью шпионов sinon

Я хотел бы проверить, что bar() вызывается внутри foo() из моего unit test.

Я понял, что Sinon spies может быть подходящим, но я не знаю, как их использовать.

Есть ли способ проверить, вызван ли метод? Возможно, даже извлечение аргументов, используемых в вызове bar()?

var spy = sinon.spy(foo);

function foo(){
    bar(1,2,3);
}

function bar(){ }

foo();

// what to do with the spy?

http://jsfiddle.net/8by9jg07/

Ответ 1

В вашем случае вы пытаетесь увидеть, был ли вызван bar, поэтому вы хотите использовать spy bar, а не foo.

Как описано в doc:

function bar(x,y) {
  console.debug(x, y);
}
function foo(z) {
  bar(z, z+1);
}
// Spy on the function "bar" of the global object.
var spy = sinon.spy(window, "bar");

// Now, the "bar" function has been replaced by a "Spy" object
// (so this is not necessarily what you want to do) 

foo(1);

bar.getCall(0).args => should be [1,2]

Теперь шпионаж о внутренних функциях функции сильно связывает ваш тест "foo" с его реализацией, поэтому вы попадете в обычный "mockist vs классические" .

Ответ 2

Я согласен с Адрианом в том, что вы, вероятно, хотели бы шпионить за баром.

var barSpy = sinon.spy(bar);

Затем, чтобы проверить, что он был вызван один раз

assert(barSpy.calledOnce);

Просто вызывается вообще

assert(barSpy.called)

Вызывается x количество раз

assert.equal(barSpy.callCount, x);

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

var args = barSpy.getCalls()[0].args

Затем вы можете делать то, что хотите, с этими аргументами.

Ответ 3

Разве вы не следите за баром, а не foo?

var spy = sinon.spy(bar)

Вызов foo:

foo()

Строка проверки была вызвана:

console.log(spy.calledOnce)