L'injection de services dépendants lors de tests unitaires AngularJS services
Je suis en essais service, mais le service A dépend de B (c'est à dire le service B est injecté dans Un service).
J'ai vu cette question mais mon cas est un peu différent parce que, à mon avis, il est plus logique de se moquer de service B au lieu d'injecter une réelle instance de service B. j'avais simulé avec un jasmin d'espionnage.
Voici un exemple de test:
describe("Sample Test Suite", function() {
beforeEach(function() {
module('moduleThatContainsServiceA');
inject([
'serviceA', function(service) {
this.service = service;
}
]);
});
it('can create an instance of the service', function() {
expect(this.service).toBeDefined();
});
});
L'erreur que j'obtiens est:
Erreur: Inconnu fournisseur de: serviceBProvider
Comment pourrais-je faire quelque chose comme cela?
- FWIW: j'ai demandé à un QUnit version de cette question ici sur CodeReview.SE.
Vous devez vous connecter pour publier un commentaire.
Effectivement dans AngularJS l'Injection de Dépendance qui utilise la dernière remporte la règle. Ainsi, vous pouvez définir votre service dans votre test juste après, y compris votre module et dépendances, et puis quand Un service que vous êtes les essais service de demande de B à l'aide de DI, AngularJS donnera moqué de version du service B.
C'est souvent ce qui est fait par la définition d'un nouveau module de MyAppMocks, mettre moqué de services/les valeurs de y et puis juste l'ajout de ce module en tant que dépendances.
Sorte de (schématiquement):
$routeProvider
a été injecté à la place de mon$routeProvider
se moquer. La courte mais très utile explication ci-dessus rappelé à l'ordre pour "avant-eaching" modules:ngRoute
PUIS la maquette PUIS le module testé, qui dépend de l'ngRoute
. Sans la première (et apparemment inutile) de référence pour le module standard, ce serait chargé avec les modules testés, substitution de la maquette.Je le faisais en CoffeeScript et trouvé un supplément de gotcha. (Aussi, j'ai trouvé le code sur cette page pour point de prêter à confusion laconique.) Voici un exemple de travail:
Sans explicitement retourner null après
$provide.value
, j'ai continué à obtenirError: Argument 'fn' is not a function, got Object
. J'ai trouvé la réponse dans ce Google Groupes thread.return
au lieu denull
. De cette façon, votre javascript généré ne sera pas avoir d'autresreturn null
ligne à la fin de la fonction. Au lieu de cela, votrebeforeEach
fonction retournera rien.SyntaxError: Unexpecte string 'serviceA'
si j'avais utiliser votre code. Aucune idée sur comment résoudre ce problème? -- Aussi à l'aide de CoffeescriptLa Valentyn solution a fonctionné pour moi, mais il est une autre alternative.
Puis quand AngularJS service d'Une requête, le Service de B par l'Injection de Dépendance, votre maquette de Service B seront fournis à la place du Service B de moduleThatContainsServiceA.
De cette façon, vous n'avez pas besoin de créer un nouveau module angulaire juste pour se moquer d'un Service.
- Je trouver la méthode la plus simple est juste pour injecter service de B et de s'en moquer. par exemple, le Service de voiture dépend de service du Moteur. Maintenant, nous avons besoin de se moquer du Moteur lors de l'essai de Voiture:
Référence: https://github.com/angular/angular.js/issues/1635
C'est ce qui a fonctionné pour moi. La clé est la définition d'un véritable module se moque de lui. Appel angulaire.se moquer.module qui fait le vrai module mockable et permet aux choses d'être connecté.