sinon.js stub - can you call more than one callbac

2019-04-22 01:53发布

If I have a stub for a function that takes 2 callbacks, how can I wire up sinon.js to call both callbacks when the stubbed function is invoked?

For example - here's function that I want to stub which takes 2 functions as arguments:

function stubThisThing(one, two) {
   ... one and two are functions ...
   ... contents stubbed by sinon.js ...
}

I can use sinon to call either one of the arguments:

stubbedThing.callsArg(0);

or

stubbedThing.callsArg(1);

but I can't seem to get both to be called. If I try:

stubbedThing.callsArg(0).callsArg(1);

or

stubbedThing.callsArg(0);
stubbedThing.callsArg(1);

then sinon will only ever call the second argument. If I wire it up in the other order, then sinon will call the first arg. However, I'd like both to be called one after the other.

2条回答
你好瞎i
2楼-- · 2019-04-22 02:29

This is not a classic scenario, since not many methods would call two methods sequentially, and I guess thats why it isn't supported. But, be calm, the solution is easy:

var subject = { 
    method: function(one, two) {} 
};

var stub = sinon.stub(subject, 'method', function(one, two) { 
    one(); 
    two(); 
});

subject.method(
    function() { console.log('callback 1'); }, 
    function() { console.log('callback 2'); });

Side note: This also gives the option for choosing if one or two should be called first.

查看更多
地球回转人心会变
3楼-- · 2019-04-22 02:42

Why don't you skip sinon altogether?

var obj = { stubMe: function(cb1, cb2) {} };
var originalMethod = obj.stubMe;

obj.stubMe = function(cv1, cb2) { 
  //Whatever logic you wish
  cb1(); 
  cb2(); 
}; 

//Do your test

obj.stubMe = originalMethod; //Restore

This way you can even continue to use sinon's APIs, if you wish:

var stub = sinon.stub();
obj.stubMe = function(cb1, cb2) { 
  stub.apply(stub, arguments);
  //Rest of whatever logic you wanted here
};

obj.stubMe();
expect(stub.calledOnce()).to.be(true); //That would pass

What'd you think?

查看更多
登录 后发表回答