RxJS使用Jasmine弹珠测试捕获操作符总是失败

RxJS使用Jasmine弹珠测试捕获操作符总是失败,jasmine,rxjs,jasmine-marbles,Jasmine,Rxjs,Jasmine Marbles,我想测试一下,如果一个可观测对象从它的一个操作符内部捕捉到抛出的错误,我会得到预期的可观测结果 下面的服务返回一个可观察的对象,该对象是否抛出错误取决于其错误参数 import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/catch'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/merge'; import 'rxjs/add/opera

我想测试一下,如果一个可观测对象从它的一个操作符内部捕捉到抛出的错误,我会得到预期的可观测结果

下面的服务返回一个可观察的对象,该对象是否抛出错误取决于其错误参数

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));
}

当您
catch
observatable的错误时,它将从catch的结果选择器中发出返回值,并正常完成observatable,因为它不会发出
error
。因此,预期的大理石输出是
-(c |)
,其中值被发出,可观察立即完成。

当您捕获可观察的错误时,它是从捕获的结果选择器发出返回值,并正常完成可观察,因为它不发出
错误。因此,预期的大理石输出是
-(c |)
,其中值被发出,可观察立即完成。

谢谢你能详细说明(c |)和c |之间的区别吗。第二个字符是否表示将在下一帧终止?是的,每个字符表示单个帧,而()表示它分组在单个帧中。谢谢,请您详细说明(c |)和c |之间的区别。第二个字符是否表示将在下一帧终止?是的,每个字符表示单个帧,而()表示它分组在单个帧中。
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 }) }) ].