2017-07-28 5 views
3

Hallo an jeden Körper Ich habe ein paar Probleme mit angular2 Unit Tests. Kann mir jemand helfen?
Ich habe einige Klasse wie folgt
Mock oder Override erweiterte Klasse in angular2

export class PostcodeApiService extends ApiService { 
 

 
    constructor(Http: Http, auth: AuthService) { 
 
    super(Http, auth); 
 
    } 
 
    
 
    getPostcodes(filterObject) { 
 
    return super.post('postcodes/filter', filterObject); 
 
    } 
 
}

export class ApiService { 
 

 

 
    constructor(private http: Http) { 
 
    } 
 

 
    post(url, payload: any) { 
 
    return new Observable((observer) => { 
 
     this.http.post(`someUrl/${url}`, payload) 
 
      .map((res: Response) => res.json()) 
 
      .catch((error: any) => { 
 
      return Observable.throw(error || `Server error ${url}`); 
 
      }) 
 
      .subscribe((data) => { 
 
      observer.next(data); 
 
      }); 
 
    }); 
 
    } 
 

 

 
}

Wie Mock von ApiService.post tun kann() Funktion?

Meine Spec-Datei wie folgt aussehen

describe('PostcodeApiService',() => { 
 

 

 
    beforeEach(() => { 
 
    TestBed.configureTestingModule({ 
 
     providers: [ 
 
     PostcodeApiService, 
 
     Http, 
 
     ConnectionBackend, 
 
     AuthService, 
 
     UserService 
 
     ], 
 
     imports: [ 
 
     HttpModule 
 
     ] 
 
    }); 
 
    }); 
 

 
    it('should ...', inject([PostcodeApiService], (service: PostcodeApiService) => { 
 
    // How ovveride post method ? 
 
    })); 
 
    
 
    
 
    
 
});

Ich wäre Ihnen dankbar, wenn Sie mich mit dieser Sache helfen könnte. Danke für die Aufmerksamkeit!

Antwort

1

ein Mock-Klasse erstellen:

class PostcodeApiServiceMock extends PostcodeApiService { 
     post(url, payload: any) { 
     // do something 
     } 
    } 

und es mit

{ provide: PostcodeApiServce, useClass: PostcodeApiServiceMock } 

Sie können hier ein gutes Beispiel finden bieten:

https://angular.io/guide/testing#test-a-routed-component

+2

Irgendwie funktioniert nicht für mich und afaik können Sie injectables nur so überschreiben (im Beispiel 'Http' und' AuthService'), n ot erweiterte Klassen :( Gibt es eine Möglichkeit, die Superklasse des Dienstes (aka Prototyp) vollständig zum Testen auszutauschen? – shoesel