J'écris des tests unitaires pour un service angular2. Extraits de code:
// 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
})));
mon 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
}
La première attente est OK, le programme passe à l'appel de la carte, pas à la capture. Mais comment puis-je obtenir le code d'état 404? res.status est null.
travaille pour moi:
mockConnection.mockRespond (new Response (new ResponseOptions ({
body: {},
status: 404
})));
Pour que l'erreur factice fonctionne, vous devez importer ResponseType depuis @ angular/http et inclure le type d'erreur dans la réponse factice, puis étendre Response et implémenter Error
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));
}
Passer en revue le code source à node_modules\@angular\http\testing\mock_backend.d.ts
. MockConnection.mockRespond
est déjà dans votre code. MockConnection.mockError
est ce dont vous pourriez avoir besoin. Jouez avec et voyez ce que vous obtenez.
Vous devez utiliser .subscribe
sur observable
pour enregistrer success
, error
& completed
rappel
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
}