web-dev-qa-db-fra.com

Méthode Jasmine Spies.and.stub

J'ai lu la documentation de Jasmine et j'ai du mal à comprendre ce que les espions .and.stub la méthode le fait réellement. L'anglais n'est pas ma langue maternelle, donc je ne sais même pas ce que le mot "stub" signifie réellement, et il n'y a pas de traduction pour cela dans ma langue.

Dans la documentation, il est écrit:

Lorsqu'une stratégie d'appel est utilisée pour un espion, le comportement de remplacement d'origine peut être renvoyé à tout moment avec and.stub.

describe("A spy", function() {  

var foo, bar = null;

  beforeEach(function() {
    foo = {
      setBar: function(value) {
        bar = value;
      }
    };

    spyOn(foo, 'setBar').and.callThrough();
  });

  it("can call through and then stub in the same spec", function() {
    foo.setBar(123);
    expect(bar).toEqual(123);

    foo.setBar.and.stub();
    bar = null;

    foo.setBar(123);
    expect(bar).toBe(null);
  });
});

Qu'est-ce que and.stub en fait et comment est-ce utile?

30
Ratko

Pour le terme, vous pouvez consulter wikipedia: http://en.wikipedia.org/wiki/Test_stub

En un mot, c'est un "faux" objet que vous pouvez contrôler qui remplace un "vrai" objet dans votre code.

Pour la fonction, ce que je comprends, c'est que and.stub() supprime l'effet de and.callThrough() sur un espion.

Quand vous appelez and.callThrough, l'espion agit comme un proxy, appelant la fonction réelle, mais passant par un objet espion vous permettant d'ajouter des tests comme l'attente.

Quand vous appelez and.stub, ou si vous n'appelez jamais and.callThrough, l'espion n'appellera pas la fonction réelle. C'est vraiment utile lorsque vous ne voulez pas tester le comportement d'un objet, mais assurez-vous qu'il a été appelé. Vous aider à garder votre test vraiment unitaire.

33
Boris Charpentier

Pour compléter la réponse précédente:

En effet, ce n'est pas clair du document, mais c'est très clair dans le code source:

https://github.com/jasmine/jasmine/blob/4be20794827a63ca5295848c58ffc478624ee4dc/src/core/SpyStrategy.js

plan = function() {};

-> la fonction appelée est vide

this.callThrough = function() {
  plan = originalFn;

-> la fonction appelée est la fonction d'origine

this.stub = function(fn) {
  plan = function() {};

-> la fonction appelée est vide (à nouveau)

11
pansay