2015-04-23 7 views
9

Wenn ich einen Stub für eine Funktion, die 2 Callbacks dauert, wie kann ich sinon.js zu Anruf beide Callbacks verdrahten, wenn die Stub-Funktion aufgerufen wird?sinon.js stub - Können Sie mehr als einen Callback für eine einzelne Stub-Funktion aufrufen?

Zum Beispiel - ist hier Funktion, die ich Stummel möchten, welche zwei Funktionen als Argumente nimmt:

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

I sinon können entweder eines der Argumente nennen:

stubbedThing.callsArg(0); 

oder

stubbedThing.callsArg(1); 

aber ich kann nicht scheinen beide genannt zu werden. Wenn ich versuche:

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

oder

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

dann sinon immer nur das zweite Argument nennen. Wenn ich es in der anderen Reihenfolge verdrahte, wird Sinon das erste Argument anrufen. Ich möchte jedoch beide nacheinander angerufen werden.

+0

hast du 'calledWith' Methode – Pawan

+0

@Pawan - meinst du die' calledWith' Funktion von der Spion-API? Das ist wirklich nicht das, wonach ich suche. Ich möchte das Verhalten eines Stubs ändern. – serg10

+0

sinon.js unterstützt nur das Anrufen von ** höchstens einem Callback pro Stub pro Call **. Es kann mehrere Rückrufe bei mehreren Anrufen z. 'stubbedThing.onCall (0) .callsArg (0); stubbedThing.onCall (1) .callsArg (1); '. Oder Sie können 'callArg' manuell aufrufen, nachdem Ihr' stubbedThing' aufgerufen wurde: z. 'stubbedThing (firstArg, secondArg); stubbedThing.callArg (0); // ruft firstArgs auf; stubbedThing.callArg (1) // ruft secondArg' – nemesv

Antwort

1

Warum überspringen Sie Sinon überhaupt nicht?

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 

diese Weise können Sie auch weiterhin zu sinon APIs verwenden, wenn Sie es wünschen:

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 

Was würden Sie denken?

+0

Wetten Beratung jemals: D – Simone

6

Dies ist kein klassisches Szenario, da nicht viele Methoden zwei Methoden nacheinander aufrufen würden, und ich denke, das ist der Grund warum es nicht unterstützt wird. Aber, seien Sie ruhig, ist die Lösung einfach:

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

Und here a runnable: sinon-stub-custom-callback

Randbemerkung: Dies gibt auch die Möglichkeit, für die Wahl, wenn ein oder zwei soll zuerst genannt werden.

Verwandte Themen