W innych testach jednostkowych natknąłem się na brakujące wiadomości <router-outlet>
, ale po to, aby mieć ładny izolowany przykład, stworzyłem AuthGuarda, który sprawdza, czy użytkownik jest zalogowany w celu wykonania określonych czynności.Jak przetestować router routera Angular2?
Jest to kod:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (!this.authService.isLoggedIn()) {
this.router.navigate(['/login']);
return false;
}
return true;
}
Teraz chcę napisać test jednostkowy do tego.
to jak zacznę mój test:
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes([
{
path: 'login',
component: DummyComponent
}
])
],
declarations: [
DummyComponent
],
providers: [
AuthGuardService,
{
provide: AuthService,
useClass: MockAuthService
}
]
});
});
stworzyłem DummyComponent że nic nie robi. Teraz mój test. Udawaj, że usługa zwraca fałsz i że wyzwala this.router.navigate(['/login'])
:
it('should not let users pass when not logged in',(): void => {
expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false);
});
Będzie to wyjątek z „Nie można odnaleźć pierwotne gniazdko do ładowania”. Oczywiście mogę używać toThrow()
zamiast toBe(false)
, ale to nie wydaje się bardzo rozsądnym rozwiązaniem. Ponieważ testuję tutaj usługę, nie ma szablonu, w którym można umieścić znacznik <router-outlet>
. Mógłbym sfałszować router i stworzyć własną funkcję nawigacji, ale o co chodzi z RouterTestingModule? Być może chcesz nawet sprawdzić, czy działała nawigacja.
Witam, możesz podać swój plik specyfikacji strażnika logowania. Byłoby mi pomocne zacząć pisać dla niego przypadki testowe. –
Za to, co jest warte, dzielę się twoją frustracją. Nie można znaleźć jednego przykładu 'RouterTestingModule' który faktycznie działa ... –