Angular2 RC5 Mock Активированные параметры маршрута
Мне нужно иметь возможность смоделировать активированные параметры маршрута, чтобы иметь возможность проверить мой компонент.
Вот моя лучшая попытка, но она не работает.
{ provide: ActivatedRoute, useValue: { params: [ { 'id': 1 } ] } },
ActivatedRoute используется в реальном компоненте следующим образом:
this.route.params.subscribe(params => {
this.stateId = +params['id'];
this.stateService.getState(this.stateId).then(state => {
this.state = state;
});
});
Ошибка, которую я получаю с моей текущей попыткой:
TypeError: undefined is not a constructor (evaluating 'this.route.params.subscribe')
Любая помощь будет принята с благодарностью.
2 ответа
Ваш макет должен отражать объект, который он заменяет. Вы .subscribe
потому что он возвращает наблюдаемый, а не только объект, поэтому ваше фиктивное значение должно также:
import { Observable } from 'rxjs/Rx';
...
{ provide: ActivatedRoute, useValue: { 'params': Observable.from([{ 'id': 1 }]) } }
Ответ, данный @jonrsharpe, позволяет вам высмеивать params
, но эти параметры будут одинаковыми в каждом тесте.
Если вы хотите иметь возможность изменить params
, чтобы установить его в начале теста, вы можете сделать это так:
На вершине:
describe('SomeComponent', () => {
(...)
let params: Subject<Params>;
(...)
в beforeEach
(async
один - где у вас есть imports
, providers
так далее.):
beforeEach(async(() => {
params = new Subject<Params>();
(...)
в providers
:
(...)
{
provide: ActivatedRoute,
useValue: {
params: params
}
}
(...)
а затем в тесте:
it('someTest', () => {
params.next({'id': '123'});
fixture.detectChanges();
(...)
ВАЖНАЯ ЗАМЕТКА
Обязательно позвони fixture.detectChanges
после params.next
,
Это означает, что вы должны удалить fixture.detectChanges
от beforeEach
и добавить его к каждому тесту.