Verifying function call and inspecting arguments using sinon spies

随声附和 提交于 2019-11-27 17:17:25

问题


I would like to verify that bar() is called inside foo() from my unit test.

I figured that Sinon spies might be suitable, but I don't know how to use them.

Is there any way to check that the method is called? Perhaps even extracting the arguments used in the bar() call?

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:


In your case, you are trying to see if bar was called, so you want to spy bar rather than foo.

As described in the 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]

Now, spying on the internals of the function strongly couples your test of "foo" to its implementation, so you'll fall into the usual "mockist vs classical" debate.




回答2:


I agree with Adrian in saying that you probably wanted to spy on bar instead.

var barSpy = sinon.spy(bar);

Then to check that it was called once

assert(barSpy.calledOnce);

Just called at all

assert(barSpy.called)

Called x amount of times

assert.equal(barSpy.callCount, x);

If you want to extract the arguments from the first call of the spy:

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

Then you can do what you want with those arguments.




回答3:


Shouldn't you be spying on bar, rather than foo?

var spy = sinon.spy(bar)

Call foo:

foo()

Check bar was called:

console.log(spy.calledOnce)


来源:https://stackoverflow.com/questions/29800733/verifying-function-call-and-inspecting-arguments-using-sinon-spies

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!