Проверьте наблюдаемый «следующий» обратный вызов в RxJs и Angular - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь сделать довольно простой тест на Angular с помощью RxJs Observables, но у меня не получится.Вот что я в основном пытаюсь проверить:

// We're inside some Angular component here...
let testMe = 0;

function somethingOrOther(): void {

    this.someService.methodReturningObservable()
      .subscribe(
          (nextValue: number): void => {
              testMe += nextValue;
          }
      ) 
}

Как проверить, что testMe корректно обновляется, когда наблюдаемое за methodReturningObservable выдает значение?

Я пыталсяэто с этим:

it(`works 'cuz I want it to`, fakeAsync(() => {
    spyOn(this.someService, 'methodReturningObservable').and.returnValue(cold('a', {a: 10}));

    tick();

    expect(component.testMe).toBe(10);
}));

Итак, tick(), похоже, здесь ничего не делает.Ничто не заставляет мою cold ценность когда-либо излучать моего шпиона.

Вместо этого я попытался getTestScheduler.flush(), как показано в https://netbasal.com/testing-observables-in-angular-a2dbbfaf5329 в разделе мрамора.

Могу ли я использовать такие шарики, чтобы испускать значение для наблюдаемой?Это было очень легко в AngularJS, просто вызвав дайджест, но я не могу заставить Anguar позволить мне в следующем обратном вызове для наблюдаемого.

1 Ответ

0 голосов
/ 14 декабря 2018

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

Вот спецификация этого Stackblitz:

it(`works with "of" 'cuz I want it to`, () => {
    spyOn(someService, 'methodReturningObservable').and.returnValue(of(10));
    component.somethingOrOther();
    expect(component.testMe).toBe(10);
});

Некоторые из изменений, которые я внес в ваш код:

  • Мне пришлось внести небольшие изменения в ваш метод компонента, чтобы он работал.Подробности в Stackblitz.
  • Функция cold() взята из библиотеки тестирования мрамора, но это слишком много для такой простой функции.rxjs имеет метод создания of Observable, который может создать холодную синхронную наблюдаемую, на которую можно подписаться (но более подробно, если вы действительно хотите проверить это таким образом).
  • Поскольку в приведенной выше спецификации используетсясинхронная наблюдаемая, нет необходимости в fakeAsync(), так как он будет завершен немедленно.
  • Тестируемый метод нужно было явно вызывать для тестирования, сделанный выше со строкой component.somethingOrOther().

Как вы можете видеть в Stackblitz, этот тест проходит очень хорошо.

Теперь, если вы хотите использовать тестирование мрамора даже для этого простого случая, я настроил другую спецификацию в Stackblitz длятот.Это выглядит следующим образом:

it(`works with "cold" 'cuz I want it to`, () => {
    spyOn(someService, 'methodReturningObservable').and.returnValue(cold('a', { a: 10 }));
    component.somethingOrOther();
    getTestScheduler().flush(); // flush the observables
    expect(component.testMe).toBe(10);
});
  • Обратите внимание на тот факт, что компонентную функцию нужно было вызывать
  • Также необходимо выполнить сброс getTestScheduler.

Оба теста сейчас проходят в Stackblitz.

Официальные документы для тестирования мрамора в Angular: здесь .

Надеюсь, это поможет.

...