Question

Nouveau pour les tests unitaires en général et Jasmine en particulier.

J'ai mis une variable dans un rappel beforeEach(), mais il ne semble pas fonctionner sur le second test. Il est censé initialisations de feu à l'avance de tous test dans son contexte, non? Je suis sûr que mon appel spyOn() est à blâmer, mais je ne sais pas comment le résoudre.

Commentaires expliquent les passes et échoue:

describe("Test suite for my library", function () {
  var html,
      body,
      play,
...

  // custom matcher...
  beforeEach(function () {
    this.addMatchers({
      toBeInstanceOf : function (constructr) {
        return this.actual instanceof constructr;
      });
    });
  });

  describe("Within the Button object", function () {

    beforeEach(function () {
      play = new Button("play", false);
    });

    describe("play", function () {

      // This test passes, as expected...
      it("should be an instance of the Button object", function () {
        expect(play).toBeInstanceOf(Button);
      });

    });

    describe("play.name", function () {

      // This test failed with the message
      // "Expected spy Button to have been called
      //  with [ 'play', false ] but it was never called."
      it("should be the first argument passed to the Button constructor", function () {
        spyOn(window, "Button");
        play = new Button("play", false); // ...until I added this line. Now it passes.
        expect(window.Button).toHaveBeenCalledWith("play", false);
      });

      // This test passes, even if the one above fails.
      it("should be 'play'", function () {
        expect(play.name).toBe("play");
      });

    });

  });
});

La href="https://github.com/pivotal/jasmine/wiki/Spies" explique l'utilisation, mais pas le contexte, de spyOn(), donc je ne peut pas dire si je l'ai créé un bug ou si je prends inconsciemment avantage d'une fonction.

Je peux poster le constructeur si quelqu'un pense que cela fait une différence dans le diagnostic, mais je peux vous assurer que c'est simple mort.

Je suis sûr que c'est une simple solution en utilisant un concept de test unitaire de base que je vais avoir à apprendre à la dure. Merci à l'avance.

P.S. Je me rends compte que je teste dans ce ne spec est pas ce que je viens de décrire. Je travaille mon chemin à travers le guide de l'API, la recherche d'un moyen d'obtenir le tableau d'arguments dans un appel de fonction, donc je peux faire un test spécifique sur arguments[0]. Conseils sont appréciés, mais pas nécessaire. Je vais comprendre.

Était-ce utile?

La solution

Réponse courte: Non, Avant chaque et espions ne sont pas incompatibles

Vous devez espionner avant d'appeler si vous voulez que l'espion de savoir sur l'appel. Vous pouvez utiliser spyOn (objet, « fonction »). AndCallThrough () si vous ne souhaitez pas interférer avec son comportement par défaut.

Réponse longue: La façon trucage / moqueur / stubbing / cadres espionnant souvent le travail est en remplaçant la méthode que vous appelez une méthode que le cadre moqueur peut contrôler. Tous les appels à cette fonction avant qu'elle ne soit remplacée par ne peut être observé l'espion. Ceci est une bonne chose, bien que légèrement gênant,

Autres conseils

Sa cause vous espionner window.Button après avoir appelé. Je ne suis pas tout à fait sûr de ce que l'espion fait, mais après tout ce qu'elle a déplacé la fonction que vous espionner avec une autre fonction où il peut vérifier la fonction a été appelée et quoi arguments a été adopté. Lorsque vous créez votre bouton avant de commencer votre test, la fonction window.button originale appelée. Ensuite, vous REMPLACE la fonction avec l'espion et vérifiez que l'espion a été appelé, de sorte que votre test doit échouer.

Semble créer soit votre bouton dans le test lui-même ou créer votre espion avant d'appeler nouveau bouton dans votre fonction beforeEach.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top