2016-10-05 1 views
1

Je commence à tester les unités JS et j'ai du mal à comprendre comment créer des tests significatifs avec les espions de Jasmine.Jasmine spyOn et comment utiliser les espions en général

it('should take an array of shopping items', function() { 
    spyOn(checkObj, 'getTotal'); 
    checkObj.getTotal([1, 2, 3]); 
    expect(checkObj.getTotal).toHaveBeenCalledWith(jasmine.any(Array)); 
}); 

Utilisation de l'extrait ci-dessus de l'essai que j'ai créé comme un exemple, je ne peux pas voir comment cela est un test utile que mon appel à GetTotal est codé en dur à l'intérieur de la spécification. Mais en même temps je voudrais m'assurer que le param passé est un tableau et non un autre type ... c'est le codage dur qui, j'en suis sûr, est faux d'une manière ou d'une autre.

Quelqu'un pourrait-il offrir un peu d'orientation sur la façon dont je pense/l'approche de ce type de scénario de test

+0

Je pense que vous cherchez au mauvais problème. La question est: qu'est-ce que vous essayez de tester? Le code que vous avez maintenant est plutôt inutile - vous l'appelez avec un tableau et sur la ligne suivante, vérifiez s'il a été appelé avec un tableau. C'est littéralement tester votre test. En d'autres termes, ce n'est pas une chose utile à vérifier. Qu'est-ce que vous voulez vérifier ici est la meilleure question? Si vous voulez vérifier que 'getTotal' n'accepte que les tableaux, alors vous devrez probablement l'appeler avec d'autres choses et attendre une sorte d'erreur. – vlaz

+0

Merci pour le commentaire vlaz, ce que vous avez dit est logique, il semble que je fais la mauvaise chose en utilisant toHaveBeenCalledWith pour tester l'argument et il serait préférable de simplement tester la sortie de la méthode. Je vais aussi essayer vos idées ... tout ce que je voulais vérifier, c'est qu'un tableau est passé comme argument, mais je ne sais pas si j'essaye de tester – user1806692

Répondre

0

Eh bien, les espions sont utiles pour un peu différent scénario. Tout dépend de la façon dont vous définissez vous-même la portée de votre test unitaire. Si vous faites l'unité minimale possible (à savoir la méthode) permet alors imaginez ce qui suit:

var x = function() { } 
x.prototype.f1 = function() { 
     //do something 
     }, 
x.prototype.f2 = function(){ 
      // do something else 
      this.f1(); 
     } 

Maintenant, dans votre test unitaire pour f2 vous n'êtes pas intéressé par la façon dont fonctionne l'intérieur f1. donc, vous faites un espion sur elle:

var a = new x(); 
a.f1 = jasmine.createSpy("spy-on-f1"); 
expect(a.f1).not.toHaveBeenCalled(); 
a.f2(); 
expect(a.f1).toHaveBeenCalled(); 

Par exemple, pour AngularJS applications, je souvent des services entiers avec simulacres espions, juste pour isoler l'algorithme de test.

En prime, vous pouvez réellement remplacer l'appel réel avec une fonction faux comme ceci:

a.f1 = jasmine.createSpy("fake-spy").and.callFake(function(){ 
    // do something predictible or return global variable that can be set externaly 
});