2016-10-28 13 views
12

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.

+0

Witam, możesz podać swój plik specyfikacji strażnika logowania. Byłoby mi pomocne zacząć pisać dla niego przypadki testowe. –

+0

Za to, co jest warte, dzielę się twoją frustracją. Nie można znaleźć jednego przykładu 'RouterTestingModule' który faktycznie działa ... –

Odpowiedz

25

Mogłem sfałszować router i utworzyć własną funkcję nawigacji, ale jaki jest sens RouterTestingModule? Być może chcesz nawet sprawdzić, czy działała nawigacja.

Nie ma prawdziwego sensu. Jeśli jego jest tylko test jednostką straży auth, a potem po prostu drwić i szpiegiem na mock aby sprawdzić, czy to navigate metoda została wywołana z login argumentu

let router = { 
    navigate: jasmine.createSpy('navigate') 
} 

{ provide: Router, useValue: router } 

expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false); 
expect(router.navigate).toHaveBeenCalledWith(['/login']); 

ten sposób jednostka testy powinny być normalnie napisane . Aby spróbować przetestować rzeczywistą nawigację, która prawdopodobnie byłaby objęta testami end-to-end.

+0

To ma sens. Po prostu nie rozumiem, dlaczego 'RouterTestingModule' pobiera trasy jako dane wejściowe. Przypuszczam, że testy e2e mogą zadziałać. Dzięki! – Bart

+4

Nie możesz _ skonfigurować żadnych tras. Jeśli chcesz go skompilować dla dyrektyw takich jak routerLink, możesz po prostu zaimportować go bez wywoływania z Routes. Aby jednak któryś z linków działał, musisz skonfigurować niektóre trasy. W twoim przypadku to, czego nam brakuje, to komponent z ''. Jeśli nie ma co najmniej jednego komponentu z gniazdem, routing nie może działać –

Powiązane problemy