2015-04-23 15 views
9

Se si dispone di uno stub per una funzione che richiede 2 richiamate, come è possibile collegare sinon.js a chiamando entrambe le callback quando viene richiamata la funzione di stub?sinon.js stub: puoi chiamare più di una callback su una singola funzione di stub?

Per esempio - qui è la funzione che voglio stub che prende 2 funzioni come argomenti:

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

posso usare Sinon chiamare uno dei due argomenti:

stubbedThing.callsArg(0); 

o

stubbedThing.callsArg(1); 

ma non riesco a ottenere entrambi per essere chiamato. Se provo:

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

o

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

poi Sinon sarà sempre e solo chiamare il secondo argomento. Se lo collego nell'altro ordine, sinon chiamerà il primo arg. Tuttavia, mi piacerebbe che entrambi venissero chiamati uno dopo l'altro.

+0

hai selezionato 'chiamatoWith' metodo – Pawan

+0

@Pawan - Vuoi dire la funzione' chiamataWith' dall'API spia? Non è proprio quello che sto cercando. Voglio modificare il comportamento di uno stub. – serg10

+0

sinon.js supporta solo chiamate ** al massimo una callback per stub per chiamata **. Può chiamare più callback su più chiamate es. 'StubbedThing.onCall (0) .callsArg (0); stubbedThing.onCall (1) .callsArg (1); '. Oppure puoi manualmente 'callArg' dopo che è stato chiamato' stubbedThing': ad es. 'stubbedThing (firstArg, secondArg); stubbedThing.callArg (0); // chiama firstArgs; stubbedThing.callArg (1) // chiama secondArg' – nemesv

risposta

1

Perché non salti del tutto 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 

In questo modo si può anche continuare a utilizzare le API di Sinon, se lo si desidera:

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 

Che ne pensi?

+0

scommesse consiglio mai: D – Simone

6

Questo non è uno scenario classico, poiché non molti metodi chiamerebbero due metodi in sequenza, e suppongo che questo sia il motivo per cui non è supportato. Ma, essere calmo, la soluzione è semplice:

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

Ed ecco un eseguibile: sinon-stub-custom-callback

Nota a margine: Questo dà anche la possibilità per la scelta se uno o due dovrebbe essere chiamato prima.