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 и добавить его к каждому тесту.

Другие вопросы по тегам