2015-04-23 133 views
9

如果我有一个需要2个回调函数的存根,那么当调用stubbed函数时,如何连接sinon.js到调用两个回调sinon.js存根(stub) - 你可以在一个stubbed函数上调用多个回调吗?

例如 - 这里就是我想存根这需要2个函数作为参数功能:

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

我可以用兴农调用的参数一方:

stubbedThing.callsArg(0); 

stubbedThing.callsArg(1); 

但我似乎无法让这两个被称为。如果我尝试:

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

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

然后兴农将只调用第二个参数。如果我以另一种顺序将它连接起来,那么sinon会称之为第一个arg。但是,我希望两个人都被一个接一个地叫出来。

+0

你有没有检查过'calledWith'方法 – Pawan

+0

@Pawan - 你的意思是来自间谍API的'calledWith'功能吗?那真的不是我想要的。我想改变存根的行为。 – serg10

+0

sinon.js只支持每次调用每个调用最多一次回调**。它可以在多个呼叫上调用多个回叫,例如。 'stubbedThing.onCall(0).callsArg(0); stubbedThing.onCall(1).callsArg(1);'。或者你可以在调用stubbedThing后手动调用'callArg': 'stubbedThing(firstArg,secondArg); stubbedThing.callArg(0); //调用firstArgs; stubbedThing.callArg(1)//调用secondArg# – nemesv

回答

1

为什么不完全跳过sinon?

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 

这样,你甚至可以继续使用兴农的API,如果你想:

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 

觉得如何?

+0

下注有建议:D – Simone

6

这不是一个典型的场景,因为没有太多的方法会按顺序调用两个方法,我想这就是为什么它不被支持。但是,要冷静,解决方案很简单:

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'); }); 

而且继承人可运行:sinon-stub-custom-callback

边注:这也给了选择,如果一个或两个应该先调用的选项。

相关问题