Проверка вызова функции и проверка аргументов с помощью шпионов 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)