2017-01-20 10 views
10

私のコンポーネントには、アニメーションが完了するまでの時間を与えるためにsetTimeout()を含むclose関数があります。setTimeout()を含む関数のテスト

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

this.showngIfにバインドされています。

this.animateは、アニメーションにバインドされています。

私はsetTimeout()がある場合にどのように適切にこの関数をテストするん

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) 
}) 

この機能をテストする必要がテストを持っていますか?

私はjasmine.clock().tick(251)を使用していましたが、ウィンドウは消えません。これについても考えていますか?

+0

'done'を使ってみましたか? – jonrsharpe

+0

@jonrsharpeどのくらい正確に –

+0

あなたの研究を始めることをお勧めします。非同期プロセスをテストするためのものです。 – jonrsharpe

答えて

20

次の2つのいずれかを実行できます。

1:実際の要素が実際に姿を消したかどうかを確認、その後、テストでsetTimeout()で250 + 1ミリ秒待ちます。

2:テストの時間をシミュレートするためfakeAsync()tick()を使用する - tick()は元close()でのsetTimeoutを解決し、チェックがfixture.whenStable().then(...)に右後発生する可能性があります。例えば

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) 
    }) 
})) 

それは実際に元のメソッドを待っているよりもはるかに高速であるように私は、第二1を使用することをお勧め。それでも1を使用している場合は、テストの前にタイムアウト時間を短くしてテストを速くしてみてください。

+0

ありがとうございます。 2番目はうまくいきましたが、tick()を使うだけでもう少し複雑でした。 'fixture.whenStable()。then(... // expects) 'の中で' expects'をラップする必要がありました。私がこの追加情報であなたの答えを更新できるようにしたら、それを正しい答えとして受け入れます。 –

+0

これに追加するには、 'tick>の前に' fixture.detectChanges() '*を追加する必要があります。その後、 'fixture.whenStable()'はまったく必要ないかもしれません(afaik fakeAsyncはそのような非同期呼び出しを避けるために設計されています)。 – dinvlad

関連する問題