2017-05-21 6 views
0

私は、コーナーバックエンドでhttpデータサービスをテストするために、角度2のコードでカルマ/ジャスミンを実行しています。私はObservable.throwを捕まえることに固執しています。このテストのアイデアは、私がテストしているデータサービスでエラーを引き起こすレスポンスボディにパースできないジャンクを置くことによって模擬レスポンスを解析する際のエラーを引き起こすことです。ここにテストの関連部分があります。角2 /カルマ/モック接続エラー処理が動作しない

beforeEach(() => { 
     this.injector = ReflectiveInjector.resolveAndCreate([ 
     {provide: ConnectionBackend, useClass: MockBackend}, 
     {provide: RequestOptions, useClass: BaseRequestOptions}, 
     Http, 
     DataQueryService, 
     ]); 
     this.testDataQueryService = this.injector.get(DataQueryService); 
     this.backend = this.injector.get(ConnectionBackend) as MockBackend; 
     this.backend.connections.subscribe((connection: any) => this.lastConnection = connection); 
    }); 

...

 it('Catches Errors' , 
     fakeAsync(() =>  { 
      var result: any; 
      var errorResult: any; 
      //result = null; 
      let testObject= {testField:'blah blah'}; 
      this.testDataQueryService.getDataFromServer ('//localhost:8080/04_EE_Project/TestServlet',null ) 
       .subscribe(mockParsedResponse => result=mockParsedResponse, error=> this.errorResult = <any>error); 

     this.lastConnection.mockRespond(new Response 
      (new ResponseOptions({body: '######' , 
      url: '//localhost:8080/04_EE_Project/TestServlet'   
        }))); 
      tick();   

     expect(result).toBeUndefined(); 
     expect(errorResult).toBeDefined(); //--- FAILING!!!! :(
          } ) ); 

は、ここで私がテストしていたデータクエリサービスです。

import { Injectable }    from '@angular/core'; 
import { Http, Response, RequestOptionsArgs }   from '@angular/http'; 

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/observable/throw'; 

@Injectable() 
export class DataQueryService { 

constructor(private http: Http) { } 

getDataFromServer(url: string, requestOptionsArgs: RequestOptionsArgs): Observable<Object> { 
     return this.http.get(url, requestOptionsArgs).map(this.extractData).catch(error => { 
     console.log('DataQueryService error thrown: ' + error); 
     var thrownError = Observable.throw(error) 
     return thrownError; }) ; 

    } 
private extractData(res: Response) { 

     var result = {"status": res["status"],"statusText": res["statusText"],"type": res["type"], "headers": res["headers"] , 
     "Body": res.json()}; 

     return result || {}; 

    } 

}

を私はいくつかの時間のデバッグを費やしていると私は「キャッチ」トリガされると、「thrownErrorは」で上で定義されていることを知っていますか:デバッグから私はキャッチが活性化されて知っていますデータサービス私はテストしています(これはデバッグ用に挿入されています)。しかし、他の側に...

error=> this.errorResult = <any>error 

は...エラー結果を取得していないので、エラーがコードされ、テストで実行するcatchブロックにもかかわらず、バックテストに来ていないとして、テストが失敗しました。 errorResultに値を設定するための 'subscribe'の2番目のコールバックは意図したとおりに機能していないようです。

私のアプローチが機能していないため、このテストでエラーを正常に取り込むにはどうすればよいですか?

答えて

0

いくつかのトラブルシューティングを行い、console.logをエラーハンドラに挿入しましたが、それは結局実行していました。テストの最後の部分に「this」というキーワードを省略すると、問題が発生しました。ここでテストが完了しました:

 it('Catches Errors' , 
     fakeAsync(() =>  { 
      var result: any; 
      var errorResult: any; 
      //result = null; 
      let testObject= {testField:'blah blah'}; 
      this.testDataQueryService.getDataFromServer ('//localhost:8080/04_EE_Project/TestServlet',null ) 
       .subscribe( mockParsedResponse => result=mockParsedResponse, 

       (err)=> {console.log('Error has been handled in test 4!: '+ err.message) ; this.errorResult=err ; } ); 

     this.lastConnection.mockRespond(new Response 
      (new ResponseOptions({body: '######' , 
      url: '//localhost:8080/04_EE_Project/TestServlet'   
        }))); 
      tick();   

     expect(result).toBeUndefined(); 
     expect(this.errorResult).toBeDefined(); //fixed now, test successful 
          } ) ); 

だからあなたのためにこれが判明しますか?

expect(this.errorResult).toBeDefined();

ではなく:

)((結果は).toBeUndefined期待します。

...私は非常にjavascriptの初心者であり、「この」キーワードはまだ完全にはわかりません。

関連する問題