В моем Angular-компоненте я создаю две наблюдаемые, используя следующий код
this.navigationEnd = this.router.events.subscribe((event: any) => {
// do some stuff
});
if (this.activeRoute.firstChild) {
this.activeRouteChild = this.activeRoute.firstChild.params.subscribe((routeParams) => {
// do some stuff
});
}
Как вы можете видеть, я подписываюсь на activeRoute и router.events.Поскольку я хороший программист, я обязательно отменяю подписку на оба при уничтожении компонента, используя ngOnDestroy
public ngOnDestroy(): void {
if (this.navigationEnd) {
this.navigationEnd.unsubscribe();
}
if (this.activeRouteChild) {
this.activeRouteChild.unsubscribe();
}
}
Теперь это здорово, но пришло время проверить, что оба элемента отменяют подписку при уничтожении компонентаэто тест, который у меня есть
describe('ngOnDestroy', () => {
it('should unsubscribe from navigationEnd & activeRouteChild on ngOnDestroy', () => {
// arrange
fixture.detectChanges();
// act
instance.ngOnDestroy();
// assert
expect((instance as any).navigationEnd.closed).toBeTruthy();
expect((instance as any).activeRouteChild.closed).toBeTruthy();
});
});
Я высмеиваю и Router, и ActivatedRoute следующим образом:
class MockRouter {
// Router
public events = of(new NavigationEnd(1, 'url/1', 'url/1'));
public navigate = () => true;
}
class MockActivatedRoute {
public firstChild = {params: of({id: '1'})};
}
, и вот как я их объявляю в массиве provider:
{provide: Router, useClass: MockRouter },
{provide: ActivatedRoute, useValue: MockActivatedRoute}
Mock Router отлично работает, однако это проблема MockActivationRoute, так как я думаю, что неправильно реализую свойство firstChild
.Я получаю сообщение об ошибке «Ошибка типа: невозможно прочитать свойство« закрыто »из неопределенного» - у меня вопрос: как правильно смоделировать ActivatedRoute и его свойство firstChild?