2016-11-30 3 views
3

Ich versuche einen Dienst zu testen, der das gefälschte http-Backend verwenden soll, das von Angulars In-Memory-Datendienst bereitgestellt wird. Dies ist der entsprechende Code:Angular 2-Dienst testen, der ein Versprechen zurückgibt

describe('getCars() method ',() => { 
     it('should return a resolved Promise', inject([DataService], (service: DataService) => { 
     service.getCars().then((value) => { 
      expect(value.length).toBe(3); 
     }); 
    })); 
    }); 

Das Problem ist, ich nicht Jasmins getan Rückruf verwenden kann, den asynchronen service.getCars() Ruf, wegen zu behandeln, wie injizieren Funktion funktioniert. Ich kann nicht async Testhelfer weder verwenden, weil es nicht mit Versprechen arbeiten kann. Also habe ich keine Ahnung, wie ich auf das Versprechen warten soll - der Test läuft einfach ohne jemals zu erreichen, erwarte.

Antwort

1

Verwenden Sie async, wodurch eine Zone eingeschlossen wird, die darauf wartet, dass alle asynchronen Tasks abgeschlossen sind, bevor der Test abgeschlossen wird.

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

            // !!!!!!! 
it('should return a resolved Promise', async(inject([DataService], (service: DataService)=>{ 
    service.getCars().then((value) => { 
    expect(value.length).toBe(3); 
    }); 
}))); 

Auch eine andere Option ist nicht inject überhaupt zu benutzen. Sie können nur Dienste von der TestBed bekommen. Es ist eine Menge cleaer

let service: DataService; 

beforeEach(() => { 
    const injector = TestBed.configureTestingModule({}); 
    service = injector.get(DataService); 
}); 

Keine Notwendigkeit für inject, und es ist viel weniger ausführlich. Sie können jetzt done verwenden. Oder wenn Sie möchten, tun Sie es immer noch den Winkel Weg, und verwenden Sie async.

Siehe auch:

+0

Die Art und Weise mit dem Erhalten der Service von einem TestBed funktioniert, danke. Wenn ich jedoch die Async-Lösung versuche, gibt der Karma-Test-Runner einen Fehler aus: "SetInterval kann nicht innerhalb eines Async-Zonentests verwendet werden" –

+1

Ja, entweder verwenden Sie explizit setInterval oder etwas, das Observable.delay verwendet. Es kann nicht in 'async' verwendet werden. Sie können es aber möglicherweise mit 'fakeAsync' verwenden. Siehe den Link im "Siehe auch". Es zeigt, wie man 'fakeAsync' verwendet –

Verwandte Themen