Angular2 Unit-test für zu Beobachten.Intervall

Ich habe einen Dienst, der Umfragen Daten werden vom server alle 500 Millisekunden. Für diese habe ich verwendet Observable.interval().

Unten ist mein code. Ich will schreiben der unit-test für diesen service

service.ts:

pollData() {
       Observable.interval(500).mergeMap(() =>
       this._http
      .get(url, { headers: headers })
      .map((resp: Response) => resp.json())
});

Service.spec.ts:

it('should get the response correctly', async(inject(
  [SomeService, MockBackend], (service, mockBackend) => {
    mockBackend.connections.subscribe((connection: MockConnection) => {
      connection.mockRespond(new Response(new ResponseOptions({ body: 
      mockResponse})));
   });
    const result = service.pollData();

    result.subscribe(response => {
       expect(response).toEqual(mockResponse);
    });
  }
)));

Immer die Fehler auf läuft ng test:

Fehler: Timeout – Asynchrone callback wurde nicht aufgerufen, innerhalb von timeout
angegeben von Jasmin.DEFAULT_TIMEOUT_INTERVAL.

InformationsquelleAutor user1722632 | 2017-11-29



2 Replies
  1. 5

    Können Sie die fakeAsync Test-Funktion und die tick Funktion simulieren Sie das Intervall. Hier ist ein Beispiel-Methode und die zugehörigen test demonstriert dieses Verhalten.

    – Komponente-Methode

    public testMe() {
      return Observable.interval(500).mergeMap((period: number) => {
        return Observable.of(period);
      });
    }

    Test-Methode

    it('should test method with interval', fakeAsync(() => {
      const obs = component.testMe();
      let currentVal = undefined;
      const sub = obs.subscribe((v) => {
        currentVal = v;
      });
      tick(500);
      expect(currentVal).toEqual(0);
      tick(500);
      expect(currentVal).toEqual(1);
      tick(500);
      expect(currentVal).toEqual(2);
      /* ... */
      sub.unsubscribe(); //must unsubscribe or Observable will keep emitting resulting in an error
    }));
    • Ich nehme an, dieser Ansatz kann nicht verwendet werden, wenn die Methode nicht Beobachtbar? Ich habe zum Beispiel ein Intervalltraining in meinem ngOnInit so habe ich keinen Zugriff auf die Beobachtbaren im test.
    • Wenn Sie keinen Zugriff auf die beobachtbaren dann wird es schwer zu testen. Vielleicht ist es ein service, können Sie stub oder gibt es einen anderen Wert, ist das Ergebnis der inneren beobachtbar, die getestet werden können?
  2. 0

    Erhöhen Sie die Standard-timeout-Intervall für jasmine. Vorausgesetzt, Ihr test benötigt 30 Sekunden, können Sie das folgende tun :

    it('should get the response correctly', async(inject(
      [SomeService, MockBackend], (service, mockBackend) => {
        mockBackend.connections.subscribe((connection: MockConnection) => {
          connection.mockRespond(new Response(new ResponseOptions({ body: 
          mockResponse})));
       });
        const result = service.pollData();
    
        result.subscribe(response => {
           expect(response).toEqual(mockResponse);
        });
      }
       //increasing the jasmine.DEFAULT_TIMEOUT_INTERVAL to 30s.
    )), 30000);
    

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.