web-dev-qa-db-fra.com

Lorsque vous utilisez Sinon, comment remplacer la fonction stub dans une instance stub?

Si j'ai créé une instance par var a = sinon.createStubInstance(MyContructor).

Comment puis-je remplacer une fonction stubbed telle que var stub = sinon.stub(object, "method", func);.

La raison principale pour laquelle je le fais est que vous souhaitez obtenir une solution de contournement de rappel multiple comme cela mentionné

12
StevenR

Je ne pense pas que cela ait beaucoup de sens, car si vous remplacez un talon par un autre talon ... alors pourquoi ne pas utiliser le premier talon pour réaliser ce que vous voulez faire avec le deuxième talon.

Quoi qu'il en soit, la sinon.stub(object, "method", func) effectue les opérations suivantes en fonction de la documentation:

Remplace object.method par une func, encapsulée dans un espion. Comme d'habitude, object.method.restore(); peut être utilisé pour restaurer la méthode d'origine.

Donc, si vous voulez remplacer une fonction de stub d'une instance de stub, pourquoi ne le faites-vous pas:

var a = sinon.createStubInstance(MyConstructor);
a.method = sinon.spy(function() { return "Foo Bar"; });

Ou si vous voulez créer un talon au lieu d'un espion:

var a = sinon.createStubInstance(MyConstructor);
a.method = sinon.stub();
13
g00glen00b

Après avoir stubé un objet entier à l'aide de sinon.createStubInstance(MyConstructor) ou sinon.stub(obj), vous pouvez uniquement remplacer le stub en affectant un nouveau stub à la propriété (comme décrit par @ g00glen00b) ou en restaurant le stub avant de le recomposer.

var a = sinon.createStubInstance(MyConstructor);
a.method.restore();
sinon.stub(object, "method", func);

L'avantage de cela est que vous pouvez toujours appeler a.method.restore() après avec le comportement attendu.

Il serait plus pratique que l'API de stub ait une méthode .call(func) pour remplacer la fonction appelée par le stub après coup.

9
flungo

1 autre façon de remplacer la méthode à partir de 2.0 +

sinon.stub(object, "method").callsFake(func);

object.method.restore()

0
Srini

Il n'est pas nécessaire d'écraser le a.method, nous pouvons plutôt utiliser callsFake sur le a.method directement:

const a = sinon.createStubInstance(MyContructor);
a.method.callsFake(func);
0
Jan Molak