2017-05-21 1 views
0

Ich habe einen Karma/Jasmine auf Angular 2 Code, um einen http-Datendienst mit einem Mock-Back-End zu testen. Ich stecke darauf fest, das Observable.strow einzufangen. Die Idee mit dem Test besteht darin, einen Fehler beim Parsen der Scheinantwort auszulösen, indem nicht-analysierbarer Junk in den Antworthauptteil eingefügt wird, der einen Fehler im Datendienst auslöst, den ich gerade teste. Hier sind die relevanten Teile des Tests.Angular 2/Karma/Mock Verbindung Fehlerbehandlung funktioniert nicht

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!!!! :(
          } ) ); 

Hier ist die Datenabfrage Service-I-Tests sind. Ich weiß aus Debuggen tun, um die Raste Aktivierung:

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 || {}; 

    } 

}

Ich habe einige Zeit Debuggen verbracht und ich weiß, dass die ‚fangen‘ ausgelöst wird und „thrownError“ definiert auf in der wird Datendienst, den ich gerade teste (dies wurde zum Debuggen eingefügt). Doch auf der anderen Seite ..

error=> this.errorResult = <any>error 

... ist nicht immer das Fehlerergebnis, so dass der Test nicht als der Fehler nicht kam zurück in den Test trotz des catch-Blockes im Code seines Test ausführen . Es scheint der zweite Callback in 'subscribe' zu sein, der befüllt werden soll. ErrorResult funktioniert nicht wie beabsichtigt.

Wie kann ich den Fehler in diesem Test erfolgreich erfassen, da mein Ansatz nicht funktioniert?

Antwort

0

Hat einige Fehlerbehandlung und Einfügen einer console.log in den Fehlerhandler und es stellt sich heraus, dass es schließlich ausgeführt wurde. Die Auslassung von "diesem" Schlüsselwort für den letzten Teil des Tests verursachte das Problem. Hier ist der Test abgeschlossen:

 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 
          } ) ); 

So stellt sich heraus, dass Sie das für ?!

erwartet (this.errorResult) .toBeDefined();

aber nicht:

erwarten (Ergebnis) .toBeUndefined();

... Ich bin sehr viel ein Anfänger auf Javascript und "dieses" Schlüsselwort verstehe ich noch nicht vollständig.

Verwandte Themen