【问题标题】:RxJS testing catch operator using Jasmine Marbles always failsRxJS 使用 Jasmine Marbles 测试 catch 运算符总是失败
【发布时间】:2018-01-11 02:26:52
【问题描述】:

我想测试一下,如果一个 observable 从它的一个操作符内部捕获一个抛出的错误,我会得到预期的结果 observable。

下面的服务根据其错误参数返回一个是否抛出错误的可观察对象。

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/merge';
import 'rxjs/add/operator/do';
import 'rxjs/add/observable/of';

export function service(obs1: Observable<number>, obs2: Observable<number>, error: boolean = false) {
  return obs1.merge(obs2)
    .map((elt) => elt * 2)
    .do(() => {
      if (error) {
        throw new Error();
      }
    })
    .catch(() => Observable.of(0));
}

有了这个茉莉花测试

import { cold } from 'jasmine-marbles';
import { Observable } from 'rxjs/Observable';
import { service } from './catch';

describe('Test Marbles', () => {
  it('should work', () => {
    const e1 = cold('-a-|', {a: 1});
    const e2 = cold('--b-|', {b: 2});
    const expected = cold('-ab-|', {a: 2, b: 4});
    const obs: Observable<number> = service(e1, e2);
    expect(obs).toBeObservable(expected);
  });

  it('should handle error', () => {
    const e1 = cold('-a-|', {a: 1});
    const e2 = cold('--b-|', {b: 2});
    const expected = cold('-c', {c: 0});
    const obs: Observable<number> = service(e1, e2, true);
    expect(obs).toBeObservable(expected);
  });
});

我得到下面第二个失败的测试的输出。

Expected [ Object({ frame: 10, notification: Notification({ kind: 'N', value: 0, error: undefined, hasValue: true }) }), Object({ frame: 10, notification: Notification({ kind: 'C', value: undefined, error: undefined, hasValue: false }) }) ] to equal [ Object({ frame: 10, notification: Notification({ kind: 'N', value: 0, error: undefined, hasValue: true }) }) ].

【问题讨论】:

    标签: jasmine rxjs jasmine-marbles


    【解决方案1】:

    当您catch observable 的错误时,它会从 catch 的结果选择器发出返回值,并且完成正常可观察,因为它不会发出 error。所以预期的弹珠输出是-(c|),其中发出值并且observable立即完成。

    【讨论】:

    • 谢谢 您能否详细说明 (c|) 和 c| 之间的区别。第二个是否意味着将在下一帧完成终止?
    • 是的,每个字符代表单帧,而()表示它被分组发生在单帧中。
    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2018-01-04
    相关资源
    最近更新 更多