Comment vous vous moquez d'un service AngularJS lors de tests unitaires avec le jasmin?
Disons que j'ai un service shop
qui dépend de deux stateful services schedule
et warehouse
. Comment puis-je utiliser différentes versions de schedule
et warehose
en shop
pour les tests unitaires?
Voici mon service:
angular.module('myModule').service('shop', function(schedule, warehouse) {
return {
canSellSweets : function(numRequiredSweets){
return schedule.isShopOpen()
&& (warehouse.numAvailableSweets() > numRequiredSweets);
}
}
});
Voici mes se moque:
var mockSchedule = {
isShopOpen : function() {return true}
}
var mockWarehouse = {
numAvailableSweets: function(){return 10};
}
Voici mes tests:
expect(shop.canSellSweets(5)).toBe(true);
expect(shop.canSellSweets(20)).toBe(false);
Vous devez vous connecter pour publier un commentaire.
Module est une fonction fournie par le angulaires-se moque de module. Si vous passez d'une chaîne en argument un module avec le nom correspondant est chargé et à tous les fournisseurs, les contrôleurs, les services, etc, sont disponibles pour la spécification. Généralement, ils sont chargés à l'aide de l'injecter fonction. Si vous passez dans une fonction de rappel, il sera appelé à l'aide Angulaire de dollars injecteur de service. Ce service examine ensuite les arguments passés à la fonction de rappel et essaie de deviner ce que les dépendances doit être transmis à la fonction de rappel.
module
directement à la fonction debeforeEach
?module
appel n'est en fait pas nécessaire.De l'amélioration Atilla de réponse et en réponse directe à KevSheedy du commentaire, dans le contexte de
module('myApplicationModule')
vous effectuez les opérations suivantes:schedule
(ou de tout service, de contrôleur, d'usine) dans lemyApplicationModule
?Avec CoffeeScript, je suis à court de quelques problèmes donc j'utilise null à la fin:
return
déclaration à la fin de la fonction, de sorte qu'au lieu de retournernull
la fonction ne serait tout simplement pas retourner quoi que ce soit. Voir stackoverflow.com/questions/15469580/...Vous pouvez regarder ici pour plus d'info
https://docs.angularjs.org/guide/services#unit-testing
Vous souhaitez utiliser les $fournir le service. Dans votre cas
J'ai récemment publié ngImprovedTesting module qui devrait faire de la maquette de test dans AngularJS plus facile.
Dans votre exemple, vous n'avez qu'à remplacer dans votre Jasmin test de la ...
... avec ...
Pour plus d'informations sur ngImprovedTesting découvrez son introduction post de blog:
http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/
Il est plus simple de mettre de la fantaisie sur le module comme ceci:
vous pouvez utiliser l'injection pour obtenir une référence à ces simulacres pour le pré test manipulations :
J'espère que ma réponse n'est pas inutile, mais vous pouvez vous moquer de services par
$provide.service
Que vous êtes à l'aide de jasmin, il est une autre façon de se moquer des appels avec le jasmin espions (https://jasmine.github.io/2.0/introduction.html#section-Spies).
À l'aide de ces, vous pouvez être la cible de vos appels de fonction, et de permettre à appeler pour se rendre à l'objet d'origine si nécessaire. Il évite l'encrassement de la tête de votre fichier de test avec $de fournir et de se moquer des implémentations.
Dans le beforeEach de votre test, j'aurais quelque chose comme:
et cela devrait fonctionner de la même manière à l' $fournir mécanisme, en notant que vous devez fournir des instances locales de l'injection de variables pour l'espionner.