Я сейчас изучаю Angular 7 (еще не использовал предыдущую версию) и столкнулся с чем-то, что не смог исправить при написании модульных тестов для службы.
У меня есть служба, которая получает JSON от RESTи разбирает его в класс.Ссылаясь на Angular Docs, я написал тест с использованием HttpClientSpy для имитации ошибки 404.
Что происходит: Тест не пройден с сообщением об ошибке: «Ожидаемые данные. ForEach не является функциейсодержать «404» »
Таким образом, Сервис получает HttpErrorResponse в качестве Входных данных, но пытается проанализировать его, как будто это был обычный ответ в функции карты.Это терпит неудачу, вызывается catchError и data.forEach не является функцией. Выдается ошибка.
Ожидаемое поведение: Я ожидал бы, что map () не будет выполнен, и он должен перейти непосредственно вфункция catchError.
Как я это исправил (на данный момент): добавление следующих строк кода в функцию map службы приводит к выполнению теста.
if (data instanceof HttpErrorResponse)
throw new HttpErrorResponse(data);
Тест:
it('should throw an error when 404', () => {
const errorResponse = new HttpErrorResponse({
error: '404 error',
status: 404, statusText: 'Not Found'
});
httpClientSpy.get.and.returnValue(of(errorResponse));
service.getComments().subscribe(
fail,
error => expect(error.message).toContain('404')
);
});
Служба:
getComments(): Observable<CommentList> {
return this.http
.get('https://jsonplaceholder.typicode.com/comments')
.pipe(
map((data: Array<any>) => {
let t: Array<Comment> = [];
data.forEach(comment => {
if(!('id' in comment) || !('body' in comment) || !('email' in comment) || !('name' in comment))
throw new Error("Could not cast Object returned from REST into comment");
t.push(<Comment>{
id: comment.id,
body: comment.body,
author: comment.email,
title: comment.name,
});
});
return new CommentList(t);
}),
catchError((err: HttpErrorResponse) => {
return throwError(err);
})
);
}
Я что-то не так делаю?Я думаю, что ожидаемое поведение - это то, что я должен испытать, по крайней мере, так я интерпретирую документы Angular.