각도 - 추가 HTTP 테스트의 TDD

이전 글에서 기본 HTTP 요청을 테스트하고 응답의 모양을 지정합니다.그러나 요청을 보낼 때 의외의 상황이 발생할 수 있습니다.응용 프로그램이 붕괴되지 않고 사용자 체험이 완벽해지기 위해서는 이러한 상황을 처리해야 한다.
본문의 코드를 찾을 수 있습니다here

HttpErrorResponse 이해


테스트 요청이 실패할 수 있는 상황을 이해하기 전에 HttpErrorResponse이것은 브라우저가 우리 프로그램에 들어오기 전에 브라우저를 둘러싸고 발생하는 네트워크 오류입니다.
실패한 HTTP 요청은 error 함수의 subscribe 콜백에 의해 캡처되었으며 오류 매개변수의 유형은 HttpErrorResponse 입니다.이것은 사용자 인터페이스에 매우 유용하다. 사용자 인터페이스에서 우리는 오류 메시지를 가져와 사용자에게 표시할 수 있다.우리가 예상한 요청에 실패하고 특정 상태 코드가 있는 테스트에도 유용하다.

this.http.get('/some/failing/request').subscribe(
   (data) => { console.log(data); },
   (error: HttpErrorResponse) => { /*Access error object here*/ }
);

400과 500 상태 코드가 있는 모든 응답은 오류로 간주되고 구독에 실패할 수 있습니다.

실패한 요청 처리


실패한 요청을 처리할 수 있는 많은 방법이 있습니다. 선택은 응용 프로그램 영역과 업무 규칙에 달려 있을 수 있습니다.일반적으로 우리는 다음과 같은 작업을 수행할 수 있습니다.
  • 사용자에게 어떤 문제가 발생했는지 알려준다
  • 백그라운드에서 재시도 요청 x회
  • 다른 페이지로 리디렉션
  • 기본값 반환
  • 가장 좋은 것은 사용자에게 무슨 일이 일어났는지 알게 하는 것이다. 그러면 그들은 기다림과 곤혹을 겪지 않을 것이다.이것은 화면에서 간단하게 메시지가 튀어나오는 형식을 취할 수 있다.오류 처리 방법이 바뀌면 나중에 이 코드를 교체하기 쉽다.
    일반적으로 Observable 구독이 실패했을 때 nextcomplete 리셋 중인 코드는 영원히 실행되지 않습니다.따라서 요청이 실패할 때마다 error 리셋에서 단언을 실행해야 합니다.이것은 서로 다른 유형의 오류에 대해 일부 오류 메시지를 표시하는지 테스트하는 데 매우 유용하다.
    이상적인 상황에서 우리는 실패한 요청을 모의하고 응용 프로그램이 회복될 수 있는지 테스트하기를 바란다.요청이 실패할 수도 있지만, 우리의 프로그램 코드는 오류를 던지고 동결되지 않는다는 것이다.시작합시다.

    테스트 작성


    우리는 같은 업무 목록 서비스를 사용할 것이다.getAllTodos 함수를 테스트해 보겠지만, 서버에 고장이 나면 빈 그룹으로 돌아갑니다.
    우리의 서비스는 다음과 같다는 것을 명심하십시오.

    나는 이 함수를 위해 단독 테스트 세트를 만들었다. 왜냐하면 나는 위에서 설명한 것보다 더 많은 테스트를 하고 싶기 때문이다


    우리의 함수는 오류에서 회복되고 정상적으로 계속되어야 하기 때문에 우리의 단언은 nextsubscribe 함수에 있다.우리는 응답 데이터가 정의되어 있으며, 길이가 0


    우리는 두 번째 파라미터를 testRequest.flush에 전달함으로써 서로 다른 상태, 상태 텍스트, 제목 등을 모의할 수 있다.이런 상황에서 500의 상태를 시뮬레이션한 것은 서버에서 내부 오류가 발생했다는 것을 의미합니다





    우리가 테스트를 실행할 때, 이 상황을 처리하기 위해 코드를 수정하지 않았기 때문에



    주의error 리셋이 어떻게 촉발되었는지, Jasmine이 제공한 fail 함수는 어떻게 실행되었는지 주의하십시오.그러나 만약 우리가 코드를 다음과 같이 수정한다면, 우리의 테스트는 통과될 것이다.



    getAllTodos() {
      return this.http.get(this.url).pipe(
        catchError((error: HttpErrorResponse) => {
          if (error.status === 500) {
            return of([]);
          }
        })
      )
    }
    

    위의 코드는 HTTP 요청을 실행하지만 오류가 발생하고 응답 상태가 500이면 빈 그룹을 포함하는 관찰 가능한 값을 되돌려줍니다.우리는 원시 값과 상반된 관찰 가능한 값을 되돌려줍니다. 왜냐하면 이것은 catchError가 기대하는


    Testing unauthorized requests


    보통, 권한 수여를 처리할 때, 서버가 우리가 누군지 알 수 있도록 요청 헤더에 접근 영패를 포함합니다.이 영패가 없으면 서버가 요청을 거부하고 401 응답을 되돌려야 한다는 것을 의미합니다


    우리가 처리해야 할 사항을 업데이트할 수 있는 권한을 부여해야 한다고 가정합니다

    요청이 승인되지 않으면 특정 오류 메시지가 표시되는지 테스트할 수 있습니다


    우리의 테스트는 다음과 같다.





    테스트를 통과한 상응하는 코드는



    
    updateTodo(updatedItem: Todo) {
      return this.http.put(`${this.url}/${updatedItem.id}`, updatedItem).pipe(
        catchError((error: HttpErrorResponse) => {
          if (error.status === 401) {
            this.displayError(error.statusText);
            return of(null);
          }
        })
      )
    }
    
    

    Testing retries


    때때로 사용자는 자신이 고장이 없어서 연결이 불안정할 수 있습니다.요청이 실패했을 때, 화면에 오류 메시지가 표시될 수 있지만, 응답은


    우리가 첫 번째 실패 후에 다시 한 번 처리해야 할 사항을 세 번 얻으려고 한다고 가정하자.만약 실패한다면, 다시 세 번 시도한 후에 오류를 던져야 합니다


    우리의 테스트:





    및 상응하는 코드:



    getSingleTodo(id: number) {
        return this.http.get(`${this.url}/${id}`).pipe(
          retry(3),
          catchError(error => {
            return throwError(`Failed to fetch item with id ${id}`)
          })
        )
      }
    

    우리의 테스트에서 우리는 404 오류를 모의할 수 있지만, 우리의 함수는 사실상 모든 오류를 포획한 후에 다시 요청을 시도합니다.이 밖에 우리가 테스트한 for 순환이 네 번 실행되었음을 주의하십시오.이것은 원본 요청에 적용되며, 다음 3회


    우리는 또한 이 함수가 오류를 던지기를 기대한다.따라서 우리의 단언은 관찰 대상error의 회조에서


    Conclusion


    본고에서 우리는 HttpErrorResponse와 가시광선에서의 표현에 대해 더욱 깊이 있게 이해했다.우리는 또한 조작 응답 데이터와 상태 코드를 통해 Http 요청을 더욱 테스트했다


    이것은 단지 주요 RxJs 조작부호를 한데 연결하는 더욱 복잡한 Http 요청을 테스트하는 기초일 뿐이다.요청을 작성할 때 더욱 자신감을 가지고, 더욱 좋은 사용자 체험을 얻기를 바랍니다.읽어주셔서 감사합니다.😄

    좋은 웹페이지 즐겨찾기