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

Verifying function call and inspecting arguments using sinon spies

我想验证我的单元测试 foo() 中是否调用了 bar()

我觉得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/

你不应该监视 bar 而不是 foo 吗?

var spy = sinon.spy(bar)

调用 foo:

foo()

调用了检查栏:

console.log(spy.calledOnce)

在你的例子中,你试图查看是否调用了 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" 的测试与其实现紧密结合,因此您将陷入通常的 "mockist vs classical" 辩论。

我同意 Adrian 的说法,您可能想监视 bar。

var barSpy = sinon.spy(bar);

然后检查是否调用了一次

assert(barSpy.calledOnce);

刚打过电话

assert(barSpy.called)

调用 x 次

assert.equal(barSpy.callCount, x);

如果您想从间谍的第一次调用中提取参数:

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

然后你就可以用这些参数做你想做的事了。