0

我有一个方法可以将 observable 作为输入并切换到新的 observable。或者,我可以使用 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": undefined, "hasValue": true, > "kind": "N", "value": "B"}}]

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

4

1 回答 1

0

基于运营商的官方文档first

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

因此,当您的obobservable 发出第一个值时,流立即完成。从您在此处打印的错误日志中,您可以看到收到的数组包含两个对象。它们都在同一帧 ( 0) 上发出,第二个的notification.kindC表示它是一个C完整的事件。

所以,你必须预料到这样的弹珠:'(b|)'.

困扰我的一件事是输出值不匹配。根据cold您创建的两个 observable,您truesourceobservable 中发出。当你打电话时mapFirstToStr(source),它会先通过first接线员,然后再通过switchMap。中的箭头函数switchMap根据三元运算符中的条件返回一个带有值的可观察对象。由于接收到的值是true,三元条件val ? 'A' : 'B'返回'A'。因此,expectedobservable 中的值不能是'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);
于 2019-08-29T21:19:46.813 回答