2017-03-28 2 views
4

私はユニットテストのために角度2のモックバックエンドから結果を得ようとしています。現在、我々はfakeAsyncと時間の経過をシミュレートするタイムアウトを使用しています。tick()を使用する関数で角2のfakeAsyncがタイムアウトを待っていますか?

現在の作業ユニットテスト

it('timeout (fakeAsync/tick)', fakeAsync(() => { 
    counter.getTimeout(); 
    tick(3000); //manually specify the waiting time 
})); 

しかし、これは我々が手動で定義されたタイムアウトに限定されていることを意味します。非同期タスクが完了したときではありません。私がやろうとしているのは、テストを続ける前にタスクが完了するまで待つようにtick()を得ることです。

これは意図したとおりに動作していないようです。私はこのシナリオをシミュレートするplnkr exampleを設定

tick() simulates the asynchronous passage of time.

fakeAsynctick答えhere上に読み

は、と説明しています。

ここでは、タイムアウトのある内部非同期タスクを呼び出すgetTimeout()メソッドを呼び出します。テストでは、getTimeout()メソッドを呼び出した後、ラップしてtick()を呼び出します。

counter.ts

getTimeout() { 
    setTimeout(() => { 
    console.log('timeout') 
    },3000) 
} 

counter.specs.ts

it('timeout (fakeAsync/tick)', fakeAsync(() => { 
    counter.getTimeout(); 
    tick(); 
})); 

しかし、ユニットテストがエラー「エラーで失敗します。まだ1つのタイマー(秒)キュー。"

issue here in the angular repoはこれと関連がありますか?

このようにtick()を使用してタイムアウト機能を待つことはできますか?それとも、もう一つのアプローチがありますか?

+1

私はシンプルな '非同期/ await'ヘルパーでこれを解決しようとしました。残念ながら、テストが合格して正しく動作している間、** zone.js **にはちょっとしたフィット感、チョーク、死亡があります。このフレームワーク特有のものをすべて使わずに簡単なサービステストを書くことができるはずです。 –

答えて

0

私は通常、私のサービスで使用するために私の単体テストでflushMicrotasksメソッドを使用します。私はtick()がflushMicrotasksと非常によく似ているが、jasmine tick()メソッドも呼び出すと読んでいました。

0

はこの仲間を試してみてください:

// I had to do this: 
it('timeout (fakeAsync/tick)', (done) => { 
    fixture.whenStable().then(() => { 
     counter.getTimeout(); 
     tick(); 
    done(); 
    }); 
}); 

Source

関連する問題