Ответ 1
Самый простой способ сделать это - просто использовать атрибут useValue
и предоставить Наблюдаемое значение, которое вы хотите высмеять.
{
provide: ActivatedRoute,
useValue: {
params: Observable.of({id: 123})
}
}
Я тестирую модуль, который используется для редактирования объекта. Объект имеет уникальный 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
, поэтому не стоит беспокоиться.
Самый простой способ сделать это - просто использовать атрибут useValue
и предоставить Наблюдаемое значение, которое вы хотите высмеять.
{
provide: ActivatedRoute,
useValue: {
params: Observable.of({id: 123})
}
}
Я понял, как это сделать!
Так как 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<>
параметра, на который полагается испытуемый субъект.
Затем, как и любая другая макетная служба, просто инициализируйте ее и переопределите поставщика для этого компонента.
Удачи!
Вот как я тестировал его в Angular 2.0 последней версии...
import { ActivatedRoute, Data } from '@angular/router';
и в разделе провайдеров
{
provide: ActivatedRoute,
useValue: {
data: {
subscribe: (fn: (value: Data) => void) => fn({
yourData: 'yolo'
})
}
}
}
Просто добавьте макет 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: () => {} } }
};
}
Для некоторых людей, работающих над Angular> 5, if Observable.of(); не работает, то они могут использовать just of(), импортируя import {of} из 'rxjs';