2017-05-21 2 views
0

모의 백 엔드가있는 http 데이터 서비스를 테스트하기 위해 각도 2 코드에서 카르마/재스민을 실행 중입니다. 나는 Observable을 덫에 걸리지 않는다. 이 테스트의 아이디어는 테스트중인 데이터 서비스에서 오류를 유발하는 응답이 아닌 junk를 응답 본문에 넣어 모의 응답을 파싱하는 동안 오류를 트리거하는 것입니다. 다음은 테스트의 관련 부분입니다.각도 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'의 두 번째 콜백이 의도 한대로 작동하지 않습니다.

내 접근 방식이 작동하지 않으므로이 테스트에서 오류를 성공적으로 캡처하려면 어떻게해야합니까?

답변

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 기대;

... 나는 자바 스크립트에 대한 초보자이며 "this"키워드는 아직 완전히 이해하지 못했습니다.

관련 문제