(Il y a une question connexe ici: le test Jasmine ne voit pas le module AngularJS )
Je veux juste tester un service sans amorcer Angular.
J'ai regardé quelques exemples et le tutoriel mais je ne vais nulle part.
Je n'ai que trois fichiers:
myService.js: où je définis un service AngularJS
test_myService.js: où je définis un test Jasmine pour le service.
specRunner.html: un fichier HTML avec la configuration normale de jasmine et où j'importe les deux autres fichiers précédents et les Jasmine, Angularjs et angular-mocks.js.
Voici le code du service (qui fonctionne comme prévu lorsque je ne teste pas):
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
Comme j'essaie de tester le service de manière isolée, je devrais pouvoir y accéder et vérifier leurs méthodes. Ma question est la suivante: comment puis-je injecter le service dans mon test sans amorcer AngularJS?
Par exemple, comment puis-je tester la valeur retournée pour une méthode du service avec Jasmine comme ceci:
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
beforeEach
dans le cas où beaucoup ... beaucoup ... de nombreux tests sont nécessaires pour le service? Tester un modèle de données (service) et il contient une tonne de variables globales. Merci, C§Bien que la réponse ci-dessus fonctionne probablement très bien (je ne l'ai pas essayé :)), j'ai souvent beaucoup plus de tests à exécuter, donc je n'injecte pas les tests eux-mêmes. Je vais regrouper les cas it () en blocs describe et exécuter mon injection dans un beforeEach () ou beforeAll () dans chaque bloc describe.
Robert a également raison en ce sens qu'il dit que vous devez utiliser l'injecteur Angular $ pour informer les tests du service ou de l'usine. Angular utilise également cet injecteur dans vos applications pour indiquer à l'application ce qui est disponible. Cependant, il peut être appelé à plusieurs endroits, et il peut également être appelé implicitement au lieu de explicitement. Vous remarquerez dans mon exemple de fichier de test de spécification ci-dessous, le bloc beforeEach () appelle implicitement injector pour rendre les choses disponibles pour être affectées à l'intérieur des tests.
Pour en revenir au regroupement et à l'utilisation de blocs avant, voici un petit exemple. Je crée un service Cat et je veux le tester, donc ma configuration simple pour écrire et tester le service ressemblerait à ceci:
app.js
Spec: Contrôleur de chats
Spec: Service de chats
EDIT Sur la base de certains des commentaires, j'ai mis à jour ma réponse pour être légèrement plus complexe, et j'ai également créé un Plunkr démontrant les tests unitaires. Plus précisément, l'un des commentaires a mentionné "Et si le service d'un contrôleur avait lui-même une simple dépendance, telle que $ log?" - qui est inclus dans l'exemple avec des cas de test. J'espère que ça aide! Testez ou piratez la planète !!!
https://embed.plnkr.co/aSPHnr/
la source
J'avais besoin de tester une directive qui nécessitait une autre directive, Google Places Autocomplete , je me demandais si je devais me moquer d'elle ... de toute façon, cela fonctionnait sans générer d'erreurs pour la directive qui exigeait gPlacesAutocomplete.
la source
Si vous voulez tester un contrôleur, vous pouvez l'injecter et le tester comme ci-dessous.
la source