Как мне написать мой однократный RxJs-код, чтобы я мог протестировать против утечек подписки?

с этим кодом:

select(): void {
        this.initialObservable$
            .pipe(
                first(),
                switchMap(() => this.service.getData())
            ).subscribe(// do stuff);
}

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

Очевидно, это мое исправление:

select(): void {
        this.initialObservable$
            .pipe(
               switchMap(() => this.service.getData()),
                first()
            ).subscribe(// do stuff);
}

и теперь это работает нормально - перемещение вызова оператора first() в конец канала.

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


person Craig    schedule 27.08.2020    source источник


Ответы (1)


Если вы вернете этот наблюдаемый здесь и подпишетесь в вызывающем, то это будет легко проверить.

scheduler.run(({ cold, expectObservable }) => {
  const source$ = cold('      -n--y--', { n: false, y: true });
  const expectedMarble = '    ----x';
  const result$ = select();
  
  expectObservable(result$).toBe(expectedMarble, { x: true });
});
person Alexander Ciesielski    schedule 27.08.2020
comment
моя проблема в том, что я не хочу делать это общедоступным. Если я это сделаю, то, вероятно, весь мой подход неверен, и при вызове select () придется подтолкнуть к объекту, который существует только для начала выполнения. - person Craig; 27.08.2020
comment
Тогда ваш подход неверен и вы тестируете не ту часть, или ваша архитектура неверна. - person Alexander Ciesielski; 27.08.2020
comment
скорее всего да, отсюда и вопрос. Мы видим, что здесь нет ссылки, но, как вы говорите, я, должно быть, ошибся, сделав это таким образом. - person Craig; 27.08.2020