如何测试使用rxjs弹珠发出分组事件的可观察对象?

时间:2018-05-18 08:26:56

标签: rxjs marble jasmine-marbles

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

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

来自文档:

  

虽然起初它可能不直观,但是在所有值同步发出时间之后,将会进行多个帧,这些帧等于组中的ASCII字符数,包括括号

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

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

有没有解决方法?

Stack Overflow上有a similar question,但没有回答'如何实际解决它并测试这种可观察的'。

谢谢!

2 个答案:

答案 0 :(得分:1)

我不知道你正在使用什么版本的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中进行测试:

答案 1 :(得分:0)

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

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