【问题标题】:How to test observables which emit grouped events with rxjs marbles?如何测试使用 rxjs 弹珠发出分组事件的可观察对象?
【发布时间】:2018-05-25 21:42:40
【问题描述】:

根据rxjs marbles documentation,同步分组的当前行为如下:

'(ab)-(cd)': on frame 0, emits a and b then on frame 50, emits c and d

来自文档:

虽然一开始可能不直观,但在所有值同步发出后,时间会前进的帧数等于组中的 ASCII 字符数,包括括号

好的,但是我如何测试这样的 observable(使用弹珠或任何其他技术):

const observable$ = of(1, 2).concat(of(3, 4).delay(20));

有什么解决方法吗?

Stack Overflow 上有 a similar question,但没有关于“如何实际解决它并测试这种 observable”的答案。

谢谢!

【问题讨论】:

    标签: rxjs marble jasmine-marbles


    【解决方案1】:

    对于我的项目,我迁移到 rx-sanbox,同步分组工作正常,它解决了我的问题。

    所以,在 rx-sandbox 中这是正确的: '(ab)-(cd)': on frame 0, emits a and b then on frame 20, emits c and d

    【讨论】:

      【解决方案2】:

      我不知道您使用的是哪个版本的 RxJS,因为您混合了原型和 pipable 运算符,但它看起来像 RxJS 5.5。

      在 RxJS 5.X 中它有点笨拙。你可以像这样重写你的测试:

      import { of } from 'rxjs/observable/of';
      import { TestScheduler } from 'rxjs/testing/TestScheduler';
      import { assert } from 'chai';
      import 'rxjs/add/operator/concat';
      import 'rxjs/add/operator/delay';
      
      const scheduler = new TestScheduler((actual, expected) => {
        console.log(actual, expected);
        return assert.deepEqual(actual, expected);
      });
      
      const observable$ = of('a', 'b').concat(of('c', 'd').delay(50, scheduler));
      
      scheduler
        .expectObservable(observable$)
        .toBe('(ab)-(cd|)');
      
      scheduler.flush();
      

      查看现场演示(打开控制台):https://stackblitz.com/edit/rxjs5-marble-test?file=index.ts

      您知道这个测试通过了,因为它没有抛出任何错误。尝试更改 next 排放的任何延迟或值,它会引发错误。

      也看看这个答案:How do I test a function that returns an observable using timed intervals in rxjs 5?

      但是,我强烈建议升级到 RxJS 6,因为它使用 coldhot “创建”功能让一切变得更容易,您可以使用 const observable$ = cold('(ab)-(cd|)') 创建与您正在做的相同的序列of(...).concat(...)

      在 RxJS 6 中测试:

      【讨论】:

      • 好吧,如果你想使用大理石测试,你至少必须通过schedulerdelay。否则它无法与时间一起工作,并且弹珠测试基于正确的时间。
      • 感谢您的详细回答,@martin。在您的回答中,您假设我可以编辑我原来的 observable。但我正在尝试从我的应用程序的真实代码中测试一些可观察的。 ` class SomeService { observable$ = of(a, b).concat(of(c, d).delay(20)); } ` 我知道这个 observable 假设会产生以下流:'(ab)-(cd)'。我想用弹珠测试它。我的问题是,由于同步分组语法,我无法使用大理石语法。在 Rxjs 6 中也是如此。对于我的项目,我迁移到同步分组工作正确的 rx-sanbox,它解决了我的问题
      猜你喜欢
      • 2019-05-18
      • 2020-02-25
      • 2020-01-09
      • 2019-12-15
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2019-02-04
      相关资源
      最近更新 更多