我有一个方法,将可观察值作为输入并切换到新的可观察值。另外,我可以使用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”,“值”:未定义}}]
答案 0 :(得分:0)
基于first
运算符的official docs:
如果不带任何参数调用,则首先发出源Observable的第一个值,然后完成。
因此,当您的ob
可观察对象发出第一个值时,流将立即完成。从您在此处打印的错误日志中,您可以看到接收到的数组包含两个对象。它们都在同一帧(0
)上发射,第二个帧的notification.kind
值为C
,这意味着它是一个C
完整事件。
因此,您必须期望这样的大理石:'(b|)'
。
困扰我的一件事是输出值不匹配。基于您创建的两个cold
观测值,您在true
观测值中发出source
。调用mapFirstToStr(source)
时,它先通过first
运算符,然后再通过switchMap
。 switchMap
中的箭头函数返回一个可观测值,其值基于三元运算符中的条件。由于接收的值为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);