Angular 8: модульный тест жасмина на ActivatedRoute, TypeError: невозможно прочитать свойство 'parent' из неопределенного - PullRequest
0 голосов
/ 07 апреля 2020

В моем приложении Angular 8 компонент имеет класс ActivatedRoute, а в ngOnInit я подписываюсь на маршрут. Я высмеял ActivatedRoute в моем файле spe c .ts, но не могу установить родительское свойство, так как оно доступно только для чтения. Он показывает TypeError: Невозможно прочитать свойство 'parent' из неопределенного. Как мы можем модульно протестировать ActivatedRoute в spe c .ts?

Вот фрагмент кода


ngOnInit() {
this.subscriptions.add(this.route.parent.queryParams.subscribe(queryParams =>{ 
this.Type = queryParams .type 
}))}

1 Ответ

1 голос
/ 07 апреля 2020

Вы можете смоделировать ваш ActivatedRoute следующим образом:

const queryParams = new QueryParams();
queryParams.set('type', '?');

const activatedRouteMock = {
   parent: { queryParams: of(queryParams) }
};

При настройке модуля тестирования внутри beforeEach.

beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [
      { provide: ActivatedRoute, useValue: activatedRouteMock } }
    ]
    ....
});

необходимо будет использовать макет. настройка activatedRouteMock Я использую QueryParams тестовый класс для удобства.

import { ParamMap } from '@angular/router';

export class QueryParams implements ParamMap {

   readonly keys: string[] = [];
   private params = new Map();

   set(name: string, value: string) {
      this.keys.push(name);
      this.params.set(name, value);
   }

   get(name: string): string | null {
      return this.has(name) ? this.params.get(name) : null;
   }

   has(name: string): boolean {
      return this.params.has(name);
   }

   getAll(name: string): string[] {
      return this.params.has(name) ? [this.params.get(name)] : [];
   }
}

ОБНОВЛЕНИЕ

В своем комментарии вы пишете, что это не работает для следующей строки кода.

this.subscriptions.add(this.route.parent.parent.parent.params.subscribe(params => { this.Id = params.Id})

Это потому, что здесь вы объединяете ссылки на parent объекты. Следовательно, ваш activatedRouteMock должен содержать более одного вложенного родительского объекта.

const activatedRouteMock = {
  parent: {
    queryParams: of(queryParams),
    parent: {
      parent: { params: of(queryParams) }
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...