RxJs - 茉莉花弹珠 forkJoin 操作符测试

tsi*_*iro 6 jasmine rxjs angular jasmine-marbles

这是 forkJoin 运算符 jasmine 大理石测试:

it('test1', () => {

 const a = cold('---a|', { a: 1 });
 const b = cold('---b|', { b: 2 });

 const observable = forkJoin(
   a,
   b
 );

 const expected = cold('---21');
 expect(observable).toBeObservable(expected);
});
Run Code Online (Sandbox Code Playgroud)

测试产生以下错误:

Expected $[0].frame = 40 to equal 30.
Expected $[0].notification.value = [ 1, 2 ] to equal '2'.
Expected $[1].frame = 40 to equal 50.
Expected $[1].notification.kind = 'C' to equal 'N'.
Expected $[1].notification.value = undefined to equal '1'.
Expected $[1].notification.hasValue = false to equal true.
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?

Pac*_*ace 6

首先---21将等待三帧,然后发出'2',然后发出'1。Fork join 不是merge它会发出一次,而是会发出[1, 2]

字母数字弹珠在发射时前进一帧。因此,无论a并且b将在框架4.完成forkJoin然后将解决发光。然后 forkJoin 将立即完成(也在第 4 帧)。

所以你得到的错误:

Expected $[0].frame = 40 to equal 30. 从 fork-join 发出的第一项是在时间 4(因为 a 和 b 在时间 4 完成)而不是在时间 3。

Expected $[0].notification.value = [ 1, 2 ] to equal '2'.发出的值[1, 2]'2'上面描述的不同。

Expected $[1].frame = 40 to equal 50.
Expected $[1].notification.kind = 'C' to equal 'N'.
Expected $[1].notification.value = undefined to equal '1'.
Expected $[1].notification.hasValue = false to equal true.
Run Code Online (Sandbox Code Playgroud)

'1'在时间 5期待 a 。它complete在时间 4得到 a 。

所以你可能想要...

const expected = cold('----(a|)', { a: [1, 2] });
expect(observable).toBeObservable(expected);
Run Code Online (Sandbox Code Playgroud)