Quelle est la différence entre
stub.yield([arg1, arg2, ...])
spy.yields([arg1, arg2, ...])
stub.callsArg(index)
dans la bibliothèque de stub Sinon.js ?
stub.yield()
est la seule que j'ai pu saisir:
stub = sinon.stub(API, 'call_remote');
callback = sinon.spy();
API.call_remote('help', callback);
@stub.yield( "solution!" );
@stub.calledOnce.should.be.true;
@callback.calledOnce.should.be.true;
@callback.args[0][0].should.eql( "solution!" );
Comme testé avec should.js, toutes les assertions passeraient.
Existe-t-il des modèles de test similaires pour stub.yields()
et stub.callsArg(index)
?
La documentation ne fournit aucun exemple pour clarifier ces deux autres méthodes mais je suis curieux à leur sujet.
Je pense que les méthodes décrites dans la documentation sont les suivantes:
spy.yield
stub.yields
stub.callsArg
La principale différence entre yields
et callsArg
peut être trouvée dans la documentation de Sinon pour les rendements:
Si une méthode accepte plusieurs rappels, vous devez utiliser callsArg pour que le stub invoque d'autres rappels que le premier.
yields
appellera l'argument de fonction premier qu'il rencontre avec tous les arguments facultatifs que vous lui fournissez. callsArg
tentera d'appeler l'argument de la fonction à index donné dans l'objet arguments
de cet appel, et ne lui passera aucun argument (vous pouvez utiliser callArgWith
pour ce comportement).
spy.yield
est très similaire à stub.yields
sauf qu'il fait partie de l'API espion et qu'il appelle tous les rappels qui lui sont passés.
Voici quelques exemples démontrant les différences (pardonnez-moi si les exemples sont un peu artificiels):
Rendements:
var fn = sinon.expectation.create().withArgs(1, 2);
var stub = sinon.stub().yields(1, 2);
stub(fn);
fn.verify();
CallsArg:
var f1 = sinon.expectation.create().never();
var f2 = sinon.expectation.create().once();
var stub = sinon.stub().callsArg(1);
stub(f1, f2);
f1.verify();
f2.verify();
Rendement:
var f1 = sinon.expectation.create().once();
var f2 = sinon.expectation.create().once();
var stub = sinon.stub().yield();
stub(f1, f2);
f1.verify();
f2.verify();