typescript - Angular RXJS HTTPClient nu capturează erorile HttpErrorResponses
Angular 12, încerc să fac să ruleze un set de teste unitare în care să prindă erorile care vin în răspunsul http, dar când rulează testele, eroarea este trecută în corpul răspunsului și nu ca o eroare.
Fișier Spec.ts
it('Test post method failure', () => {
const expected: HttpErrorResponse = new HttpErrorResponse({
error: 'Bad Request',
status: 400,
statusText: 'Bad Request'
});
service.post({ urlIdentifier: 'test', endpoint: '123' }).subscribe({
next: res => {
// This is being run
console.log(res)
},
error: error => {
// This is not run.
expect(error.status).toBeCloseTo(expected.status);
expect(error.statusText).toEqual(expected.error);
}}
);
Metoda testată
export class HttpService {
constructor(public http: HttpClient) {};
post<T>({ urlIdentifier, endpoint, body }: HttpMethodsArguments): Observable<T> {
const url: string = this.getBaseUrl(urlIdentifier) + endpoint;
return this.http.post<T>(url, body, {
headers: this.getHttpHeaders()
}).pipe(
catchError(err => {
return throwError(err);
})
);
}
LOG din obiectul res: HttpErrorResponse(headers: ..., status: 400, statusText: "Cerere incorectă" ...) Rezultatul așteptat pe care îl doresc apare doar în obiectul res în test, în loc să apară ca o eroare. Probabil este ceva mic ce îmi scapă, dar nu pot rezolva asta.
Răspuns #1
Comentariul lui Melvin a fost corect. Nu era generată o eroare, așa că Catch Error nu se activa. Am adăugat un pipe pentru a arunca eroarea în cazul unui HttpErrorResponse.
export class HttpService {
constructor(public http: HttpClient) {};
post<T>({ urlIdentifier, endpoint, body }: HttpMethodsArguments): Observable<T> {
const url: string = this.getBaseUrl(urlIdentifier) + endpoint;
return this.http.post<T>(url, body, {
headers: this.getHttpHeaders()
}).pipe(
map(x => {
if (x instanceof HttpErrorResponse) {
throw x;
}
return x;
})
)
.pipe(
catchError(err => {
return throwError(err);
})
);
}
