Ich habe Service mit HttpClient mit einer POST-Anfrage, wenn der Server antwortet mit und Fehler muss ich es fangen formatieren Sie die Nachricht und werfen Sie es erneut. Ich habe versucht, dieses Szenario zu testen, habe es aber versäumt, den Test zu verspotten. Die HttpTestingController sendet nicht meine benutzerdefinierte Fehlermeldung zurück, noch wird es auf den Dienst zu kontrollieren und wieder werfen sie, Was ist der richtige Weg, um diesesTesten von Angular 4 HttpTestingController mit Catch und _throw Fehlerlogik
der Service-Code zu tun:
login(credentials: LoginPayload): Observable<LoginSuccessPayload> {
return this.http.post<LoginSuccessPayload>('/api/auth/signin', credentials)
.map(res => {authUser: res.user})
.catch((error: HttpErrorResponse) => {
if (error.message) {
return _throw(error);
}
return _throw({message: 'Notification.LoginError'});
});
}
jetzt der Test
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [AuthService]
});
authService = TestBed.get(AuthService);
httpMock = TestBed.get(HttpTestingController);
});
it('should format the error message', (done) => {
const credentials = {userName: 'bob', password: '123'} as LoginPayload;
const mockErrorResponse = {message: 'failed to login'} ;
authService.login(credentials).subscribe(() => {}, err => {
expect(err.message).toEqual(mockErrorResponse.message);
done();
});
const req = httpMock.expectOne('/api/auth/signin');
req.error(new ErrorEvent(mockErrorResponse.message));
httpMock.verify();
});
Ich mag Ihre Lösung, und es funktioniert auch für mich. Aber was bewirkt, dass flush() in Ihrem Code einen Fehler an den Abonnenten zurückgibt? Soll nicht req.error() aufgerufen werden, um einen Fehler zu emulieren? –
@YakovFain Das zweite Argument von .flush(), das ein Objekt mit Eigenschaften wie dem Statuscode enthält. –
Ich habe versucht, flush() mit dem Status 200, aber es geht immer noch an den Error-Handler des Abonnenten. Das funktioniert bei mir: '' 'req.error (new ErrorEvent ('Der Fehlertext')); ... .subscribe (() => {}, errorResponse => erwarten (errorResponse.error.type).toEqual ('Der Fehlertext') ); '' ' –