Тест HTTP 404 ответов об ошибках в Angular 7 - PullRequest
2 голосов
/ 19 марта 2019

У меня есть конечная точка API, которая возвращает ошибку 404 для поиска, когда результатов нет.В этом случае я использовал catchError в службе Angular для возврата пустого массива.Это работает при запуске приложения, однако я пытаюсь написать тестовый пример для него, и оно никогда не попадает в блок catchError.Чего мне не хватает ??

Сервисный код:

  public searchStuff(query: SearchQuery): Observable<Array<Stuff>> {
    const url: string = `${this.appConfig.baseUrl}/stuffs?title=${query.searchTerm}`;
    return this.httpClient.get<Array<Stuff>>(url).pipe(
      tap(() => console.log('made request')),
      map(data => data.map(stuff => new Stuff(stuff)),
      catchError((error) => {
        if (error.status === 404) {
          console.log('Not Found');
          return of(new Array<Stuff>());
        }

        throw error;
      })
    ));
  }

Тест:

  it('should handle a 404 when no search results are found', inject([HttpTestingController], (mockController: HttpTestingController) => {
    const service: SearchService = TestBed.get(SearchService);

    const query: SearchQuery = new SearchQuery();
    query.searchFor = 'stuffs';
    query.searchTerm = 'something';

    service.searchWorks(query).subscribe(results => {
      expect(results).toBeDefined();
    });

    const req = mockController.expectOne(request => {
      return request.url === 'http://localhost/stuffs?title=something' && request.method === 'GET';
    });

    const errorEvent: ErrorEvent = new ErrorEvent('Not Found');
    req.error(errorEvent, { status: 404, statusText: 'Not Found'});
    // req.flush(null, { status: 404, statusText: 'Not Found ' });
    mockController.verify();
  }));

У меня есть положительный тест, который вызывает req.flush([]), это делает console.log('made request') где тест 404 не подходит.

1 Ответ

0 голосов
/ 19 марта 2019

Похоже, что порядок операторов является ключевым в этом сценарии. catchError должен предшествовать карте, и все приложение и спецификация, похоже, работают.

  public searchStuff(query: SearchQuery): Observable<Array<Stuff>> {
    const url: string = `${this.appConfig.baseUrl}/stuffs?title=${query.searchTerm}`;
    return this.httpClient.get<Array<Stuff>>(url).pipe(
      tap(() => console.log('made request')),
      catchError((error) => {
        if (error.status === 404) {
          console.log('Not Found');
          return of(new Array<Stuff>());
        }

        throw error;
      }),
      map(data => data.map(stuff => new Stuff(stuff))
    ));
  }
...