2016-03-30 1 views
0

J'essaie de tester un service AngularJS qui utilise $resource. Pour le garder isolé, je voudrais utiliser spyOn de Jasmine et espionner la méthode query() de $resource. Dans mon contrôleur, je voudrais être en mesure d'utiliser la forme courte de query() où vous passez un succès et une fonction d'erreur directement à la méthode de requête sans appeler $promise.then(success, error). Est-ce possible, ou suis-je coincé avec la forme longue de query().$promise.then(success, error)?

Voici un plunker j'ai créé avec un test n'illustrant mon problème: http://plnkr.co/edit/hVc2YNnwUDNv7IHODOMD?p=preview

J'ai trouvé plusieurs questions sur les demandes de SO pour résoudre le problème, mais tous utilisent des versions beaucoup plus anciens des composants que je utilise. Du plunker vous pouvez voir que je travaille avec Angular 1.5.2 et Jasmine 2.4.1. En tant que question connexe, un certain nombre de tutoriels montrent que dans votre contrôleur, vous pouvez simplement affecter la valeur de retour query() à un tableau, et que les données sont chargées, le tableau sera mis à jour. C'est la solution la plus propre, mais que se passe-t-il si une erreur se produit? Je m'attendrais à ce que s'il y a un problème de chargement des données, vous vous retrouviez avec une notification d'erreur par défaut, ou rien du tout. Est-ce la meilleure pratique pour gérer les erreurs ailleurs via un intercepteur et peut-être déclencher un événement et informer l'utilisateur d'une manière spécifique non-contrôleur générique? Je pense que l'intercepteur aurait besoin d'un moyen de déterminer quel message afficher à l'utilisateur pour donner un peu de contexte, par exemple 'Chargement de Bagels semble prendre plus de temps que d'habitude, cliquez ici pour réessayer' code d'état '

Répondre

1

Vous devriez toujours pouvoir utiliser la fonction raccourcis lorsque vous passez dans les fonctions comme requête (succès, erreur). Pour fixer le test unitaire, vous devez tenir compte de la fonction d'erreur comme indiqué ci-dessous:

spyOn(mockBagelApiService, 'query').and.callFake(function(callback1, callback2) { 
    queryDeferred.promise.then(callback1); 
    queryDeferred.promise.catch(callback2); 
    return {$promise: queryDeferred.promise} 
    }); 

callFake prendra dans les paramètres que vous passez dans query() qui sont deux fonctions pour le succès et l'erreur. Selon que la promesse a été résolue ou rejetée, vous devez gérer les blocs then et catch avec le rappel approprié. La façon dont j'ai traité les erreurs de demande dans mes applications angulaires consiste à créer un service de gestionnaire d'erreurs qui est appelé dans le bloc catch et qui reçoit un message d'erreur spécifique et affiche un modal. Vous pouvez le configurer comme vous le souhaitez: vous pouvez définir les boutons modaux à recharger ou à rediriger, etc. Pour gérer le message, vous pouvez configurer vos services pour renvoyer les codes problèmes qui donnent une description de la situation telle que USER_IS_NOT_AUTH ou OAUTH_ERROR que votre gestionnaire d'erreurs peut utiliser pour fournir une réponse plus spécifique.