Angular2サービスの単体テストを書いています。コードスニペット:
// 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
})));
私のサービス:
// 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
}
最初の期待は問題ありません。プログラムはキャッチではなくマップ呼び出しに入ります。しかし、どうすればステータスコード404を取得できますか? res.statusはnullです。
私のために働く:
mockConnection.mockRespond (new Response (new ResponseOptions ({
body: {},
status: 404
})));
モックエラーを機能させるには、@ angular/httpからResponseTypeをインポートし、モックレスポンスにエラータイプを含めてから、Responseを拡張して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));
}
node_modules\@angular\http\testing\mock_backend.d.ts
のソースコードを調べます。 MockConnection.mockRespond
は既にコードに含まれています。 MockConnection.mockError
は必要なものです。それで遊んで、あなたが得るものを見てください。
observable
を介して.subscribe
を使用して、success
、error
およびcompleted
コールバックを登録する必要があります。
コード
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
}