Wie zum Hohn Eckige 4.3 httpClient eine Fehlermeldung als Antwort in der Prüfung
Habe ich eine unten interceptor auth-interceptor.service.ts
import {Injectable, Injector} from '@angular/core';
import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import {Cookie} from './cookie.service';
import {Router} from '@angular/router';
import {UserService} from './user.service';
import {ToasterService} from '../toaster/toaster.service';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private injector: Injector) {}
private handleError(err: HttpErrorResponse): Observable<any> {
let errorMsg;
if (err.error instanceof Error) {
//A client-side or network error occurred. Handle it accordingly.
errorMsg = `An error occurred: ${err.error.message}`;
} else {
//The backend returned an unsuccessful response code.
//The response body may contain clues as to what went wrong,
errorMsg = `Backend returned code ${err.status}, body was: ${err.error}`;
}
if (err.status === 401 || err.status === 403) {
this.injector.get(UserService).purgeAuth();
this.injector.get(ToasterService).showError(`Unauthorized`, errorMsg);
this.injector.get(Router).navigateByUrl(`/login`);
}
console.error(errorMsg);
return Observable.throw(errorMsg);
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
//Clone the request to add the new header.
const authReq = req.clone({headers: req.headers.set(Cookie.tokenKey, Cookie.getToken())});
//Pass on the cloned request instead of the original request.
return next.handle(authReq).catch(err => this.handleError(err));
}
}
Nun bin ich versucht, zu verhöhnen, die http.get
zu werfen, die Fehler, so dass die Methode handleError
Konsolen, die die Fehlermeldung.
Unten ist mein Ansatz, um den test-Fall auth-interceptor.service.specs.ts
import {async, inject, TestBed} from '@angular/core/testing';
import {AuthInterceptor} from './auth-interceptor.service';
import {ApiService} from './api.service';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import {environment} from '../../../environments/environment';
describe(`AuthInterceptor`, () => {
const somePath = `/somePath`;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [AuthInterceptor, ApiService]
});
});
it(`should be created`, inject([AuthInterceptor], (service: AuthInterceptor) => {
expect(service).toBeTruthy();
}));
it(`should log an error to the console on error on get()`, async(inject([ApiService, HttpTestingController],
(apiService: ApiService, httpMock: HttpTestingController) => {
spyOn(console, 'error');
apiService.get(somePath).subscribe((res) => {
console.log(`in success:`, res);
}, (error) => {
console.log(`in error:`, error);
});
const req = httpMock.expectOne(`${environment.apiUri}${somePath}`);
req.flush({
type: 'ERROR',
status: 404,
body: JSON.stringify({color: `blue`})
});
expect(console.error).toHaveBeenCalled();
}))
);
});
Beim Spülvorgang die Antwort, ich bin nicht sicher, wie Sie Sie bündig in eine Fehler Antwort, so dass die Methode handleError
genannt werden in meinen interceptor und schließlich fordert console.error
. Dokumentation keine Beispiel für meine situation. Jede Hilfe oder Anregungen wird sehr geschätzt.
Ihre
req
Objekt ist eine Instanz von TestRequest
Klasse. Es hat auch error()
Methode. Haben Sie versucht, so etwas wie req.error(new ErrorEvent('fail'), {status: 404});
?
InformationsquelleAutor Sai Ram Gupta | 2017-09-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
expectOne
Methode inHttpTestingController
Klasse gibt eineTestRequest
Objekt. Diese TestRequest Klasse hat eineflush
Methode, die verwendet werden können, zu liefernKönnen wir beheben die Anfrage durch Rückgabe eines Körper zusammen mit einige zusätzliche Antwort-Header (wenn vorhanden). Relevante Infos finden Sie hier.
Nun, kommen wir zurück zu dem Punkt, wie Sie dies tun können. Sie können die folgende code-snippet wie pro Ihre Nutzung Fall.
HINWEIS: zum Zeitpunkt des Schreibens dieses Kommentar
statusText
erforderlich istmockErrorResponse
. Ergänzende Infos finden hier.P. S.: Die
error
Methode derTestRequest
Klasse kann verwendet werden, um zu simulieren, Netzwerk-Fehler, der in unserem test-Fall, denn es erwartet Sie eine Instanz des Fehlers. Der folgende Codeausschnitt zeigt, dass.InformationsquelleAutor Rohit Sharma