7

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

'(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 上有一个类似的问题,但没有关于“如何实际解决它并测试这种可观察的”的答案。

谢谢!

4

2 回答 2

4

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

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

于 2018-05-25T13:42:40.703 回答
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排放值,它会引发错误。

也看看这个答案:如何在 rxjs 5 中测试一个使用定时间隔返回可观察对象的函数?

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

在 RxJS 6 中测试:

于 2018-05-18T14:06:02.313 回答