it-swarm.com.de

Testen Sie eine Funktion, die ein setTimeout () enthält.

Ich habe eine enge Funktion in meiner Komponente, die eine setTimeout() enthält, um der Animation Zeit zu geben.

public close() {
    this.animate = "inactive"
    setTimeout(() => {
       this.show = false
    }, 250)
}

this.show ist an eine ngIf gebunden.

this.animate ist an eine Animation gebunden.

Ich habe einen Test, der diese Funktion testen muss

it("tests the exit button click", () => {
  comp.close()
  fixture.detectChanges()
  //verifies the element is no longer in the DOM
  const popUpWindow = fixture.debugElement.query(By.css("#popup-window"))
  expect(popUpWindow).toEqual(null)
})

Wie testen Sie diese Funktion bei setTimeout()?

Ich habe jasmine.clock().tick(251) benutzt, aber das Fenster würde niemals verschwinden. irgendwelche Gedanken dazu auch?

18
ed-tester

Sie können zwei Dinge tun:

1: Warten Sie im Test 250 + 1 ms in einer setTimeout() und prüfen Sie dann, ob das Element tatsächlich verschwunden ist.

2: Verwenden Sie fakeAsync() und tick(), um die Zeit im Test zu simulieren. Eine tick() löst das setTimeout in der ursprünglichen close() auf, und die Überprüfung kann unmittelbar danach in einer fixture.whenStable().then(...) erfolgen.

Zum Beispiel:

it("tests the exit button click", fakeAsync(() => {
  comp.close()
  tick(500)
  fixture.detectChanges()

  fixture.whenStable().then(() => {
    const popUpWindow = fixture.debugElement.query(By.css("#popup-window"))
    expect(popUpWindow).toBe(null)
  })
}))

Ich schlage vor, die zweite zu verwenden, da sie viel schneller ist, als tatsächlich auf die ursprüngliche Methode zu warten. Wenn Sie immer noch das erste verwenden, versuchen Sie, die Timeout-Zeit vor dem Test zu verringern, damit es schneller läuft.

44
Mezo Istvan

Ich habe es gerade in meinem Projekt ausprobiert und funktioniert:

jasmin.Uhr (). Tick (10);

1
Jack Luo