모의 백 엔드가있는 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'의 두 번째 콜백이 의도 한대로 작동하지 않습니다.
내 접근 방식이 작동하지 않으므로이 테스트에서 오류를 성공적으로 캡처하려면 어떻게해야합니까?