2016-02-16 3 views
20

Ich schreibe Komponententests für einen angular2 Service. Code-Schnipsel:wie HTTP-Fehler für angular2 Test zu spotten

// jasmine specfile 

// already injected MockConnection into Http 

backend.connections.subscribe ((c: MockConnection) => { 
    connection = c; 
}); 

// doing get-request 
myServiceCallwithHttpRequest().subscribe (result => { 
    // this test passes! 
    expect (result).toEqual ({ 
     "message": "No Such Object" 
    }); 
    // this test fails, don't know how to get the response code 
    expect (whereIsResponseStatus).toBe (404); 
}); 

connection.mockRespond (new Response (new ResponseOptions ({ 
    body: { 
     "message": "No Such Object" 
    }, 
    status: 404 
}))); 

mein Service:

// service 

myServiceCallwithHttpRequest(): Observable<Response> { 
    return this.http.get ('/my/json-service').map (res => { 
      // res.status == null 
      return res.json() 
     }) 
     .catch (this.handleError); // from angular2 tutorial 
} 

Die erste erwarten OK ist, geht das Programm in die Karte Aufruf, nicht der Haken. Aber wie bekomme ich den Statuscode 404? res.status ist null.

Antwort

-1

Werke für mich:

mockConnection.mockRespond (new Response (new ResponseOptions ({ 
     body: {}, 
     status: 404 
    }))); 
+2

Hat nicht funktioniert für mich, Dies löste den "NextObserver" anstelle von "ErrorObserver" in der "subscribe" -Funktion aus. – Gabriel

+0

das gleiche hier, dies nennt nicht den gescheiterten beobachtbaren Fall – sam

1

Sie müssen .subscribe über die observable verwenden success zu registrieren, error & completed Rückruf

-Code

myServiceCallwithHttpRequest(): Observable<Response> { 
    return this.http.get ('/my/json-service').map (res => { 
      // res.status == null 
      return res.json() 
     }) 
     .subscribe(
      data => this.saveJwt(data.id_token), //success 
      err => { //error function 
       //error object will have status of request. 
       console.log(err); 
      }, 
      () => console.log('Authentication Complete') //completed 
     ); 
     //.catch (this.handleError); // from angular2 tutorial 
} 
+0

Fehler: (105, 16) TS2322: Typ 'Abonnement ' ist nicht dem Typ 'Observable ' zuweisbar. Die Eigenschaft 'Quelle' fehlt im Typ 'Abonnement '. – user3725805

+0

Position (105,16) ist dies in der zweiten Zeile – user3725805

2

über den Code Quelle bei node_modules\@angular\http\testing\mock_backend.d.ts gehen. MockConnection.mockRespond ist bereits in Ihrem Code. MockConnection.mockError ist, was Sie brauchen können. Spielen Sie damit und sehen Sie, was Sie bekommen.

+0

Sorry für den Downvote auf diese, nach Durchlaufen der Definitionen der Weg, um diese Arbeit zu bekommen war in der Tat die Verwendung der MockError mit einer benutzerdefinierten Fehlerklasse – amay0048

37

die mock Fehler Funktion zu erhalten, müssen Sie Response von @ Winkel/http und umfassen den Fehlertyp in der Mock-Antwort importieren, dann Antwort erweitern und implementieren Fehler

import { Response, ResponseOptions, ResponseType, Request } from '@angular/http'; 
import { MockConnection } from '@angular/http/testing'; 

class MockError extends Response implements Error { 
    name:any 
    message:any 
} 

... 
handleConnection(connection:MockConnection) { 
    let body = JSON.stringify({key:'val'}); 
    let opts = {type:ResponseType.Error, status:404, body: body}; 
    let responseOpts = new ResponseOptions(opts); 
    connection.mockError(new MockError(responseOpts)); 
} 
+0

Vielen Dank [amay0048] (http://stackoverflow.com/users/3145286/amay0048), ich habe Ihre Lösung auf der [GitHub Problem] gesehen (https://github.com/angular/angular/pull/8961). Das funktioniert für mich. –

+0

Diese Lösung funktioniert perfekt! – Intrepid

+0

Danke MAN. rettete mich. –

Verwandte Themen