2016-10-25 2 views
1

Ich versuche, einen Komponententest für eine Methode zu schreiben, die eine http.get-Methode enthält, und ich habe Probleme, sie zum Laufen zu bringen. Ich weiß, dass die Einstellung der Klasse für Http als MockBackend falsch ist und deshalb bekomme ich den Fehler: get() method does not exist aber ich weiß nicht, was ich für die Mock-Klasse hinter http verwenden soll.Angular 2 RC6-Test HTTP.get löst einen Fehler aus Die get() -Methode existiert nicht

describe('Http Service',() => { 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     SharedHttpService, 
     { 
      provide: SharedCookieService, 
      useClass: MockSharedCookieService 
     }, { 
      provide: Http, 
      useClass: MockBackend 
     } 
     ] 
    }); 
    }); 

    beforeEach(inject([ SharedHttpService, Http ], (_httpService: SharedHttpService, _mockBackend: MockBackend) => { 
    httpService = _httpService; 
    mockBackend = _mockBackend; 
    })); 

    describe('get',() => { 
    it(`should call setAuthToken and make the get request with the authorization headers`,() => { 
     let fakeUrl: string = 'www.fakeurl.com'; 
     httpService.headers = mockHeaders; 
     spyOn(httpService, 'setAuthToken'); 
     spyOn(httpService.http, 'get').and.callThrough(); 
     mockBackend.connections.subscribe((connection: MockConnection) => { 
     let options: ResponseOptions = new ResponseOptions({ 
      body: { } 
     }); 
     connection.mockRespond(new Response(options)); 
     }); 
     httpService.get(fakeUrl,() => { }) 
     .subscribe(() => { 
     expect(httpService.setAuthToken).toHaveBeenCalled(); 
     expect(httpService.http.get).toHaveBeenCalledWith(fakeUrl, { headers: mockHeaders }); 
     }); 
    }); 
    }); 

-Code hinter:

export class SharedHttpService { 
    private headers: Headers = new Headers(); 

    constructor( private cookieService: SharedCookieService, 
       private http: Http ) { } 

    public get(address: string, callback: any): Observable<any> { 
    return this.setAuthToken() 
     .map(() => { }) 
     .switchMap(() => { 
     return this.http.get(address, { headers: this.headers }) 
      .map(callback) 
      .catch((error: any) => this.handleError(error)); 
     }); 
    } 
} 

Antwort

2

Sie müssen die MockBackend nicht als der Http verwenden, aber zu erstellen die Http. Sie tun das mit einer Fabrik

imports: [ HttpModule // this is needed ], 
providers: [ 
    SharedHttpService, 
    MockBackend, 
    BaseRequestOptions // @angular/http 
    { 
    provide: Http, 
    deps: [ MockBackend, BaseRequestOptions ], 
    useFactory: (backend: MockBackend, options: BaseRequestOptions) => { 
     return new Http(backend, options); 
    } 
    } 
] 

Jetzt können Sie die MockBackend in den Tests injizieren, so dass Sie die Antwort auf die Verbindung spotten kann.

        // MockBackend not Http 
beforeEach(inject([ SharedHttpService, MockBackend ], 
      (_httpService: SharedHttpService, _mockBackend: MockBackend) => { 
    httpService = _httpService; 
    mockBackend = _mockBackend; 
})); 

Eine andere Sache, müssen Sie einen asynchronen Test verwenden, da der Aufruf an subscribe löst asynchron

import { async } from '@angular/core/testing'; 

it('...', async(() => { 

})); 

Siehe auch Angular 2 Testing - Async function call - when to use

Verwandte Themen