我应该如何编写单次运行的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()运算符调用移到管道的末端。

我一直在研究茉莉花大理石测试,我相信我需要参考可观察到的数据流来测试它,但我没有。因此,回归测试将非常混乱,这使我认为我在做的事情一定是不好的做法。请问以单元可测试的方式编写此类代码的正确方法是什么?大理石测试更佳。

解决方法

如果您在此处返回该可观察值并订阅调用方,则可以轻松进行测试。

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 });
});