Angular 7 - отлов HttpErrorResponse в модульных тестах - PullRequest
0 голосов
/ 04 декабря 2018

Я сейчас изучаю 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.

...