L'INTERFACE utilisateur du routeur interfère avec $httpbackend de test de l'unité, angular js
C'est un contrôleur avec une fonction envoyer:
$scope.submit = function(){
$http.post('/api/project', $scope.project)
.success(function(data, status){
$modalInstance.dismiss(true);
})
.error(function(data){
console.log(data);
})
}
}
C'est mon test
it('should make a post to /api/project on submit and close the modal on success', function() {
scope.submit();
$httpBackend.expectPOST('/api/project').respond(200, 'test');
$httpBackend.flush();
expect(modalInstance.dismiss).toHaveBeenCalledWith(true);
});
L'erreur que j'obtiens est:
Error: Unexpected request: GET views/appBar.html
views/appBar.html est mon templateUrl:
.state('project', {
url: '/',
templateUrl:'views/appBar.html',
controller: 'ProjectsCtrl'
})
Donc, en quelque sorte l'interface utilisateur du routeur est de faire mon $httpBackend point pour cela à la place de ma fonction envoyer. J'ai le même problème dans tous mes tests à l'aide de $httpBackend.
Est qu'il ya une solution pour cela?
- Pertinentes de l'INTERFACE utilisateur-Routeur question no 212 avec quelques solutions de contournement: github.com/angular-ui/ui-router/issues/...
Vous devez vous connecter pour publier un commentaire.
Prendre ce gist
https://gist.github.com/wilsonwc/8358542
L'ajouter à un fichier appelé stateMock dans votre test/se moquer de dossier, d'inclure ce fichier dans votre karma config si elle n'est pas déjà ramassé.
Le programme d'installation avant votre test doit alors ressembler à ceci:
Puis dans votre test, vous devez ajouter
$stateParams
sont transmis sur une transition à l'aide de$state.go
? ie: test$state.go('users', {name: 'Bob' })
correctement passe{name: 'Bob'}
dans le cadre de la transition?state
finit pas défini lors de la tentativestate.expectTransitionTo('project');
dans le test - les pointeurs?Cette Github question à propos de Unité d'INTERFACE de Test Routeur explique plus en détail ce qui se passe.
Le problème est que
$httpBackend.flush()
déclenche une émission qui déclenche alors l'autre cas de lastateProvider
.Une solution simple peut être de faire la configuration suivante, comme indiqué par @darinclark dans Github fil citées ci-dessus. Ceci est valable si vous n'avez pas besoin de tester les transitions de l'état. Sinon, jetez un oeil à @rosswil réponse qui est inspirée par @Vratislav réponse sur Github.
ÉDITÉ
Merci à Chris T à le signaler dans les commentaires, semble après v0.2.14? la meilleure façon de le faire est d'utiliser
$urlRouterProvider.deferIntercept()
fonction. Voir github.com/angular-ui/ui-router/issues/...$urlRouterProvider
est obsolète depuis la v1.0.0. Utilisation$urlServiceProvider.deferIntercept();
à la place.Si vous ne voulez pas ajouter de gist fichiers comme il est dit dans la solution correcte vous pouvez ajouter un "lors de" condition pour $httpBackend ignorer OBTENIR des pétitions de vues comme ceci:
.passThrough is not a function
erreur, je ne sais pas pourquoi. Cela a fonctionné pour moi:$httpBackend.whenGET(/templates\/.*/).respond('');
.passThrough
est disponible dans angulaire e2e tests (ngMockE2E
), mais pas dans les tests unitaires (ngMock
)J'ai la même erreur votre commenté, après un appel de service qu'ils me poser des questions sur l'url de l'interface utilisateur de l'itinéraire.
Pour résoudre le problème de l'appel dans le cas contraire, l'interface utilisateur de l'itinéraire dans les essais est pas injecter $état dans beforeach de tresorerie. Dans mon test, $etat ont pas de sens pour l'utiliser.
Déplacer vos services pour leur propre module qui n'ont pas de dépendance sur l'interface utilisateur.routeur. votre application principale dépend de ce module. Lorsque vous testez ne pas tester l'application principale, tester le module qui a votre services. Le stateprovider ne vais pas essayer de changer l'état/route parce que ce module ne sait rien à propos de l'interface utilisateur.routeur. Cela a fonctionné pour moi.