2015-04-23 6 views
9

अगर मैं एक समारोह है कि 2 कॉलबैक लेता है के लिए एक ठूंठ है, मैं कैसे जब टोंटदार समारोह शुरू हो जाती है कॉल दोनों कॉलबैक को sinon.js ऊपर तार कर सकते हैं?sinon.js स्टब - क्या आप एकल स्टब किए गए फ़ंक्शन पर एक से अधिक कॉलबैक कॉल कर सकते हैं?

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

मैं या तो तर्क में से एक कॉल करने के लिए सिनोन उपयोग कर सकते हैं:

stubbedThing.callsArg(0); 

या -

उदाहरण के लिए यहाँ समारोह है कि मैं ठूंठ जो तर्क के रूप में 2 कार्यों लेता है चाहता हूँ

stubbedThing.callsArg(1); 

लेकिन मुझे लगता है कि दोनों को कहा जा सकता है। अगर मैं कोशिश:

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

या

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

तो सिनोन ही कभी दूसरा तर्क कॉल करेंगे। अगर मैं इसे दूसरे क्रम में तार देता हूं, तो साइनऑन पहले तर्क को कॉल करेगा। हालांकि, मैं दोनों को एक के बाद एक कहा जाना चाहूंगा।

+0

क्या आपने 'कॉल किया गया' विधि – Pawan

+0

@Pawan - क्या आपका मतलब जासूस एपीआई से 'कॉल किया गया' फ़ंक्शन है? यह वास्तव में वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं एक स्टब के व्यवहार को बदलना चाहता हूं। – 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

आप साइनऑन को पूरी तरह से क्यों नहीं छोड़ते?

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

दांव सलाह: डी – Simone

6

यह एक क्लासिक परिदृश्य, के बाद से नहीं कई तरीकों दो तरीकों क्रमिक रूप से कहेंगे नहीं है, और मैं thats लगता है क्यों यह समर्थित नहीं है। लेकिन, शांत होना, समाधान आसान है:

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

और यहाँ एक runnable: sinon-stub-custom-callback

साइड नोट: यह भी चुनने अगर एक या दो पहले बुलाया जाना चाहिए के लिए विकल्प देता है।

संबंधित मुद्दे