Подтвердить что ты не робот

Как unit test компонент, который зависит от параметров от ActivatedRoute?

Я тестирую модуль, который используется для редактирования объекта. Объект имеет уникальный id, который используется для захвата определенного объекта из массива объектов, размещенных в службе. Конкретный id получается через параметр, который передается через маршрутизацию, в частности через класс ActivatedRoute.

Конструктор выглядит следующим образом:

 constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}

ngOnInit() {
    this._curRoute.params.subscribe(params => {
        this.userId = params['id'];
        this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];

Я хочу запустить базовые модульные тесты для этого компонента. Тем не менее, я не уверен, как я могу ввести параметр id, и компонент нуждается в этом параметре.

Кстати: у меня уже есть макет для службы Session, поэтому не стоит беспокоиться.

4b9b3361

Ответ 1

Самый простой способ сделать это - просто использовать атрибут useValue и предоставить Наблюдаемое значение, которое вы хотите высмеять.

{
  provide: ActivatedRoute,
  useValue: {
    params: Observable.of({id: 123})
  }
}

Ответ 2

Я понял, как это сделать!

Так как ActivatedRoute - это сервис, для него может быть установлен макет службы. Позвоните в этот макет службы MockActivatedRoute. Мы продолжим ActivatedRoute в MockActivatedRoute следующим образом:

class MockActivatedRoute extends ActivatedRoute {
    constructor() {
        super(null, null, null, null, null);
        this.params = Observable.of({id: "5"});
    }

Строка super(null, ....) инициализирует суперкласс, который имеет четыре обязательных параметра. Однако в этом случае нам не нужно ничего из любого из этих параметров, поэтому мы инициализируем их значениями null. Все, что нам нужно, это значение params, которое является Observable<>. Поэтому при this.params мы переопределяем значение params и инициализируем его как Observable<> параметра, на который полагается испытуемый субъект.

Затем, как и любая другая макетная служба, просто инициализируйте ее и переопределите поставщика для этого компонента.

Удачи!

Ответ 3

Вот как я тестировал его в Angular 2.0 последней версии...

import { ActivatedRoute, Data } from '@angular/router';

и в разделе провайдеров

{
  provide: ActivatedRoute,
  useValue: {
    data: {
      subscribe: (fn: (value: Data) => void) => fn({
        yourData: 'yolo'
      })
    }
  }
}

Ответ 4

Просто добавьте макет ActivatedRoute:

providers: [
  { provide: ActivatedRoute, useClass: MockActivatedRoute }
]

...

class MockActivatedRoute {
  // here you can add your mock objects, like snapshot or parent or whatever
  // example:
  parent = {
    snapshot: {data: {title: 'myTitle ' } },
    routeConfig: { children: { filter: () => {} } }
  };
}

Ответ 5

Для некоторых людей, работающих над Angular> 5, if Observable.of(); не работает, то они могут использовать just of(), импортируя import {of} из 'rxjs';