Bon, j'ai été de tomber sur un problème depuis longtemps et j'aimerais entendre l'avis du reste de la communauté.
Tout d'abord, examinons quelques abstrait contrôleur.
function Ctrl($scope, anyService) {
$scope.field = "field";
$scope.whenClicked = function() {
util();
};
function util() {
anyService.doSmth();
}
}
Il est clair que nous avons ici:
- régulière échafaudage pour contrôleur
$scope
et certains services injecté - sur le terrain, et de la fonction attachée à la portée
- méthode privée
util()
Maintenant, j'aimerais couvrir cette classe de tests unitaires (Jasmine). Cependant, le problème est que je veux vérifier que lorsque je clique sur (appelez - whenClicked()
) un élément que l' util()
méthode sera appelée. Je ne sais pas comment le faire, puisque, dans le Jasmin tests je suis toujours avoir des erreurs que soit la fantaisie pour util()
n'a pas été défini ou n'a pas été appelé.
Note: je ne suis pas d'essayer de corriger cet exemple particulier, je parle de test, par exemple du modèle de code en général. Donc merci de ne pas me dire "ce qui est exact de l'erreur". Je me demande comment faire, pas comment résoudre ce problème.
J'ai essayé un certain nombre de façons de contourner cela:
- évidemment je ne peux pas utiliser
$scope
dans mes tests d'unité que je n'ai pas cette fonction attachée à cet objet (il se termine généralement avec message d'Expected spy but got undefined
ou similaire) - J'ai essayé de l'attacher à ces fonctions, le contrôleur de l'objet via
Ctrl.util = util;
puis de vérifier se moque comme d'Ctrl.util = jasmine.createSpy()
mais dans ce cas -Ctrl.util
n'est pas appelée si les tests échouent - J'ai essayé de changer de
util()
à être attachéthis
objet et se moquantCtrl.util
encore une fois, avec pas de chance
Eh bien, je ne peux pas trouver mon chemin autour de cela, je m'attends de l'aide de JS ninjas, un travail de violon, ce serait parfait.