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

Я хотел бы проверить это bar() внутри foo() из моего модульного теста.

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

есть ли способ проверить, что метод вызывается? Возможно, даже извлечение аргументов, используемых в 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/

3 ответов


в вашем случае, вы пытаетесь увидеть, если bar был вызван, поэтому вы хотите шпионить 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 " с его реализацией, поэтому вы попадете в обычное "мокист против классика" обсуждения.


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

var barSpy = sinon.spy(bar);

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

assert(barSpy.calledOnce);

просто позвонил вообще

assert(barSpy.called)

называется X количество раз

assert.equal(barSpy.callCount, x);

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

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

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


разве вы не должны шпионить за баром, а не фу?

var spy = sinon.spy(bar)

вызов foo:

foo()

Check bar был вызван:

console.log(spy.calledOnce)