【问题标题】:Test observable mapping using marbles使用弹珠测试可观察映射
【发布时间】:2019-05-18 00:15:08
【问题描述】:

我有一个方法可以将 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 , "notification": {"error": > undefined, "hasValue": false, "kind": "C", "value": undefined}}]

【问题讨论】:

    标签: typescript observable rxjs-marbles


    【解决方案1】:

    基于official docs 运算符的first

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

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

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

    困扰我的一件事是输出值不匹配。基于您创建的两个 cold observable,您在 source observable 中发出 true。当您调用mapFirstToStr(source) 时,它会通过first 运算符,然后通过switchMapswitchMap 中的箭头函数返回一个 observable,其值基于三元运算符中的条件。由于接收到的值为true,因此三元条件val ? 'A' : 'B' 返回'A'。因此,expected observable 中的值不能是'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);
    

    【讨论】:

      猜你喜欢
      • 2020-02-25
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多