Модульное тестирование: сервис Mocking, который возвращает наблюдаемые объектам, чтобы проверить изменение значений во времени, заставляет TS выбросить TS2339 - PullRequest
0 голосов
/ 15 января 2019

У меня есть служба, которая возвращает значения, предоставляемые селекторами ngrx, и компонент, который определяет эту службу, внедряет ее и устанавливает свойства на основе значений, возвращаемых службой.

Я пишу модульные тесты для компонента, использующего макет сервиса, и мне нужен сервис макета, чтобы возвращать разные значения для каждого модульного теста. Чтобы сделать это, я определил фиктивный класс обслуживания, чтобы он возвращал предметы вместо наблюдаемых. Тесты выполняются, но TS выдает ошибку, говоря, что интерфейс фиктивного сервиса не соответствует интерфейсу реального сервиса, так как реальный сервис возвращает наблюдаемые.

Stackblitz

Stabblitz работает и тесты выполняются правильно, но, как вы видите, TS выдает ошибку TS2339: свойство 'next' не существует для типа 'Observable'

Я нашел, что могу добавить // @ ts-ignore над каждым вызовом .next (), чтобы компилятор TypeScript игнорировал ошибку, но это не лучшее решение.

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

1 Ответ

0 голосов
/ 15 января 2019

Вы можете получить реальную услугу И макет вернуть то же самое, используя метод .asObservable() в BehaviorSubject. Вы также можете использовать метод do(), который вам необходим для установки нового значения в BehaviorSubject.

Чтобы продемонстрировать, я собрал этот StackBlitz . Вот MockTestService от этого StackBlitz:

MockTestService {
    private _test$ = new BehaviorSubject(10);
    public test$ = this._test$.asObservable();
    do(param: number): void { this._test$.next(param); }
}  

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

...