При возникновении ошибки модульный тест Angular/Karma/Jasmine завершается неудачно
У меня есть модульный тест Карма / Жасмин для метода перехвата угловой перехватчик, который возвращает rxjs Observable. Если есть какая-то ошибка в успешном тестировании модуля обратного вызова, он будет отображаться как пройденный, даже если он потерпит неудачу. Код:
тестируемый метод:
intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
...
return next.handle(req);
}
тестовое задание:
it("some test desc", () => {
const headers = ...
const request = new HttpRequest('GET', '/test', '', { headers });
const next = jasmine.createSpyObj('HttpHandler', ['handle']);
const errorResponse = new HttpErrorResponse({
status: 401,
error: 'SOME_ERROR_CODE'
});
next.handle.and.returnValue(throwError(errorResponse));
console.log('before');
interceptor.intercept(request, next).subscribe(
() => fail('Observable should resolve with error.'),
(res: HttpErrorResponse) => {
console.log('in');
throw new Error('some error happened here');
expect(res).toBe(errorResponse);
}
);
console.log('after');
});
Я могу исправить это, вызвав done в конце моего обратного вызова с ошибкой, как описано здесь, но я не понимаю, почему это необходимо, поскольку мой код выполняется синхронно (из-за throwxrrxs rxjs, использующего queueScheduler), что может быть подтверждено порядком в котором выполняются журналы (до, в, после).
1 ответ
Кажется, что RxJS ловит ошибку, выданную подписчиком, и сбрасывает ее в следующем тике.