Модульный тест: служба имитации, которая возвращает наблюдаемые объекты для возврата субъектов, чтобы проверить изменение значений с течением времени, заставляет TS генерировать TS2339

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

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

Stackblitz

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

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

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


person bubble    schedule 15.01.2019    source источник


Ответы (1)


Вы можете сделать так, чтобы реальный сервис И макет возвращали то же самое, используя метод .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); }
}  

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

person dmcgrandle    schedule 15.01.2019
comment
Это действительно работает, но кажется излишним определять каждое свойство класса как BehaviourSubject, подписываться на каждый селектор вручную (и управлять этой подпиской) и копировать это значение в свойство службы, чтобы затем преобразовать его в наблюдаемое, чтобы юнит-тесты компилируются. Я нашел другое решение - передать имитацию службы любому, хотя это все еще не идеально, по крайней мере, это не подразумевает изменения логики для адаптации к модульным тестам. Спасибо за вашу помощь - person bubble; 18.01.2019
comment
Рад, что ты разобрался. :) - person dmcgrandle; 18.01.2019