Comment tester Angular2 du routeur.naviguer?
J'ai couru en manque <router-outlet>
messages dans d'autres tests unitaires, mais juste pour avoir un joli exemple isolé, j'ai créé un AuthGuard qui vérifie si un utilisateur est connecté pour certaines actions.
C'est le code:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (!this.authService.isLoggedIn()) {
this.router.navigate(['/login']);
return false;
}
return true;
}
Maintenant, je veux écrire un test unitaire pour cela.
C'est comment j'ai commencer mon test:
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes([
{
path: 'login',
component: DummyComponent
}
])
],
declarations: [
DummyComponent
],
providers: [
AuthGuardService,
{
provide: AuthService,
useClass: MockAuthService
}
]
});
});
J'ai créé un DummyComponent qui ne fait rien.
Maintenant mon test. Prétendre que le service renvoie la valeur false et qu'il déclenche des this.router.navigate(['/login'])
:
it('should not let users pass when not logged in', (): void => {
expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false);
});
Ce lève une exception avec "Impossible de trouver le courant principal à charge".
Évidemment, je peux utiliser toThrow()
au lieu de toBe(false)
, mais qui ne vous semble pas très sensible à la solution. Depuis que je suis en essais un des services proposés ici, il n'y a pas de modèle où je peux mettre la <router-outlet>
tag. Je pourrais en dérision le routeur et faire mon propre naviguer fonction, mais alors quel est le point de RouterTestingModule? Peut-être même vous voulez vérifier que la navigation travaillé.
Pour ce que ça vaut, je partage votre frustration. Ne pouvez pas trouver un seul exemple de
RouterTestingModule
qui fonctionne réellement...OriginalL'auteur Bart | 2016-10-28
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de véritable point. Si le son est juste un test unitaire pour l'auth garde, puis il suffit de se moquer et d'espionnage sur la maquette pour vérifier que c'est
navigate
méthode a été appelé avec l'login
argumentC'est de cette façon unité tests devraient normalement être écrit. Pour essayer de tester tout réel de navigation, qui serait probablement à l'automne sous l'égide de la fin à la fin de l'essai.
RouterTestingModule
prend les itinéraires d'entrée. Je suppose que, pour e2e tests qui pourraient travailler. Merci!Vous n'avez pas pour configurer des itinéraires. Si vous voulez juste pour compiler pour les directives telles que routerLink, vous pouvez simplement importer sans appeler withRoutes. Pour l'un de ces liens pour fonctionner, cependant, vous devez configurer certains itinéraires. Dans votre cas, ce que tu nous manque, c'est un composant avec un
<router-outlet>
. Si il n'y a pas au moins un composant avec une prise de courant, le routage ne peut pas fonctionnerOriginalL'auteur Paul Samsotha