使用大理石测试可观察的贴图

时间:2018-12-17 15:40:08

标签: typescript observable rxjs-marbles

我有一个方法,将可观察值作为输入并切换到新的可观察值。另外,我可以使用map而不是switchMap。如何使用弹珠对此进行测试?

mapFirstToStr(ob: Observable<boolean>): Observable<string> {
   return ob.pipe(
       first(),
       switchMap(val => of(val ? 'A' : 'B'))
   );
}

这不起作用:

const source = cold('a', { a: true });
const expected = cold('b', { b: 'B' });
expect(mapFirstToStr(source)).toBeObservable(expected);

我收到以下错误:

  

期望值等于:        [{“ frame”:0,“ notification”:{“ error”:未定义,“ hasValue”:true,>“ kind”:“ N”,“ value”:“ B”}}]

     

收到:        [{“ frame”:0,“ notification”:{“ error”:未定义,“ hasValue”:true,>“ kind”:“ N”,“ value”:“ B”}}},{“ frame”:0 ,“通知”:{“错误”:>未定义,“ hasValue”:假,“种类”:“ C”,“值”:未定义}}]

1 个答案:

答案 0 :(得分:0)

基于first运算符的official docs

  

如果不带任何参数调用,则首先发出源Observable的第一个值,然后完成。

因此,当您的ob可观察对象发出第一个值时,流将立即完成。从您在此处打印的错误日志中,您可以看到接收到的数组包含两个对象。它们都在同一帧(0)上发射,第二个帧的notification.kind值为C,这意味着它是一个C完整事件。

因此,您必须期望这样的大理石:'(b|)'

困扰我的一件事是输出值不匹配。基于您创建的两个cold观测值,您在true观测值中发出source。调用mapFirstToStr(source)时,它先通过first运算符,然后再通过switchMapswitchMap中的箭头函数返回一个可观测值,其值基于三元运算符中的条件。由于接收的值为true,三元条件val ? 'A' : 'B'返回'A'。因此,expected中可观察的值不能为'B'(这是错误日志中的值),而不能为'A'

因此,您将发出第一个值false

const source = cold('a', { a: false });
const expected = cold('(b|)', { b: 'B' });
expect(mapFirstToStr(source)).toBeObservable(expected);

或者您期望'A'

const source = cold('a', { a: true });
const expected = cold('(b|)', { b: 'A' });
expect(mapFirstToStr(source)).toBeObservable(expected);