【问题标题】:How should I write my single run RxJs code so that I can test against subscription leaks?我应该如何编写我的单次运行 RxJs 代码,以便我可以测试订阅泄漏?
【发布时间】:2020-08-27 22:44:00
【问题描述】:

使用此代码:

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() 运算符调用移动到管道的末尾。

我一直在研究 jasmine marble 测试,我相信我需要对可观察流的引用来测试它,而我没有。所以回归测试会很混乱,这让我觉得我在做的事情一定是不好的做法。请问以单元可测试的方式编写此类代码的正确方法是什么?最好用于大理石测试。

【问题讨论】:

    标签: angular rxjs jasmine-marbles


    【解决方案1】:

    如果您在此处返回该 observable 并在调用者中订阅,那么这将很容易测试。

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

    【讨论】:

    • 我的问题是我不想公开那个可观察的。如果我这样做了,那么我的整个方法可能是不正确的,调用 select() 将不得不推送到一个只存在于开始执行的主题。
    • 那你的方法不正确,你在测试错误的部分,或者你的架构不正确
    • 很可能是的,因此是这个问题。我们可以看到没有参考,但正如你所说,我这样做一定是错了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 2015-09-15
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多