RxJS-тестирование оператора catch с использованием 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/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 }) }) ].
1 ответ
Когда ты catch
ошибка наблюдаемой, она генерирует возвращаемое значение из селектора результата catch и завершает наблюдаемое как обычно, так как не генерирует error
, Таким образом, ожидаемый выход мрамора -(c|)
где значение испускается и наблюдаемый завершается немедленно.