使用sinon间谍验证函数调用和检查参数

时间:2015-04-22 14:27:55

标签: javascript unit-testing sinon

我想验证我的单元测试bar()内是否foo()

我认为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/

3 个答案:

答案 0 :(得分:26)

在您的情况下,您正试图查看是否调用了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]

现在,监视函数的内部结构强烈地将你的测试结果与#34; foo"它的实施,所以你将陷入通常的"mockist vs classical"辩论。

答案 1 :(得分:9)

我同意阿德里安的说法,你可能想要监视吧。

var barSpy = sinon.spy(bar);

然后检查它是否被调用一次

assert(barSpy.calledOnce);

刚刚调用

assert(barSpy.called)

被调用x次

assert.equal(barSpy.callCount, x);

如果你想从第一次调用spy中提取参数:

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

然后你可以用这些论点做你想做的事。

答案 2 :(得分:1)

难道你不是在监视吧,而不是foo吗?

var spy = sinon.spy(bar)

拨打foo:

foo()

调用条形码:

console.log(spy.calledOnce)