2016-10-28 5 views
12

Я столкнулся с отсутствием сообщений <router-outlet> в других модульных тестах, но для того, чтобы иметь хороший изолированный пример, я создал AuthGuard, который проверяет, зарегистрирован ли пользователь для определенных действий.Как проверить маршрутизатор Angular2.navigate?

Это код:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    if (!this.authService.isLoggedIn()) { 
     this.router.navigate(['/login']); 
     return false; 
    } 
    return true; 
} 

Теперь я хочу написать модульный тест для этого.

Это, как я начинаю мой тест:

beforeEach(() => { 
    TestBed.configureTestingModule({ 
     imports: [ 
      RouterTestingModule.withRoutes([ 
       { 
        path: 'login', 
        component: DummyComponent 
       } 
      ]) 
     ], 
     declarations: [ 
      DummyComponent 
     ], 
     providers: [ 
      AuthGuardService, 
      { 
       provide: AuthService, 
       useClass: MockAuthService 
      } 
     ] 
    }); 
}); 

Я создал DummyComponent, который ничего не делает. Теперь мой тест. Притворись, что служба возвращает ложь, и что это вызывает this.router.navigate(['/login']):

it('should not let users pass when not logged in',(): void => { 
    expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false); 
}); 

Это сгенерирует исключение с «Не удается найти первичный выход для загрузки». Очевидно, я могу использовать toThrow() вместо toBe(false), но это не похоже на очень разумное решение. Поскольку я тестирую службу здесь, нет шаблона, где я могу поместить тег <router-outlet>. Я мог бы издеваться над маршрутизатором и сделать свою собственную навигационную функцию, но тогда в чем смысл RouterTestingModule? Возможно, вы даже хотите проверить работу навигации.

+0

Привет, вы можете предоставить свой spec-файл защиты входа. Было бы полезно начать писать для него тестовые примеры. –

+0

Для чего это стоит, я разделяю ваше разочарование. Не удается найти один пример «RouterTestingModule», который действительно работает ... –

ответ

25

Я мог бы издеваться над маршрутизатором и сделать свою собственную навигационную функцию, но тогда в чем смысл RouterTestingModule? Возможно, вы даже хотите проверить работу навигации.

Нет реальной точки. Если его просто тестовый модуль для Идента охранника, а потом просто издеваюсь и шпионить на макете, чтобы проверить, что это navigate метод было вызвано с login аргументом

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

{ provide: Router, useValue: router } 

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

Это как блоком тесты обычно должны быть написано , Чтобы попытаться протестировать любую реальную реальную навигацию, это, вероятно, подпадает под общее тестирование.

+0

Это имеет смысл. Я просто не понимаю, почему «RouterTestingModule» берет маршруты в качестве входных данных. Я полагаю, что тесты e2e могут работать. Благодаря! – Bart

+4

У вас нет _have_ для настройки любых маршрутов. Если вы просто хотите, чтобы он компилировался для таких директив, как routerLink, вы можете просто импортировать его _without_, вызывая withRoutes. Однако для любых ссылок на работу вам необходимо настроить некоторые маршруты. В вашем случае то, что вам не хватает, это компонент с '<маршрутизатором-выходом>'. Если нет хотя бы одного компонента с розеткой, маршрутизация не может функционировать –

Смежные вопросы