根据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,但没有回答'如何实际解决它并测试这种可观察的'。
谢谢!
答案 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,因为通过cold
和hot
“创建”功能,您可以使用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