Angular 2でテストするときにTestBedで非同期関数を使用するのはいつですか?
いつこれを使用しますか?
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
});
そして、いつこれを使用しますか?
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
});
}));
誰もこれで私を啓発できますか?
async
は、async
がすべてのタスクを完了するまで、次のテストの開始を許可しません。 async
が行うことは、すべての非同期タスク(たとえば、setTimeout
)が追跡されるゾーンでコールバックをラップすることです。すべての非同期タスクが完了すると、async
が完了します。
Angular以外でJasmineを使用したことがある場合は、done
がコールバックに渡されるのを目にしたことがあるでしょう。
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
ここで、これはネイティブジャスミンです。ここでは、done()
を呼び出すまでこのテストの完了を遅らせる必要があることをジャスミンに伝えます。 done()
を呼び出さず、代わりにこれを実行した場合:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
Promiseはafterを解決するため、テストは期待される前でも完了します。テストは同期タスクの実行を終了します。
Angular(Jasmine環境)では、Angularは実際にdone
を使用するときにasync
を舞台裏で呼び出します。ゾーン内のすべての非同期タスクを追跡し、それらがすべて完了すると、done
が舞台裏で呼び出されます。
TestBed
構成を使用する特定のケースでは、compileComponents
を使用する場合に一般的にこれを使用します。そうでなければ、それを呼び出さなければならない状況に陥ることはめったにありません
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
templateUrl
を使用するコンポーネントをテストする場合(webpackを使用していない場合)、Angularはテンプレートを取得するためにXHRリクエストを行う必要があるため、コンポーネントのコンパイルは非同期になります。したがって、テストを続行する前に、それが解決するまで待つ必要があります。
テストで非同期呼び出しを行うと、非同期呼び出しが完了する前に実際のテスト機能が完了します。呼び出しが完了したときに何らかの状態を確認する必要がある場合(通常これが該当します)、テストフレームワークは、まだ非同期作業が行われている間にテストが完了したと報告します。
async(...)
を使用すると、テストを完了したものとして扱う前に、リターンフレームワークまたはオブザーバブルが完了するまで待機するようにテストフレームワークに指示します。
it('should show quote after getQuote promise (async)', async(() => {
fixture.detectChanges();
fixture.whenStable().then(() => { // wait for async getQuote
fixture.detectChanges(); // update view with quote
expect(el.textContent).toBe(testQuote);
});
}));
then(...)
に渡されたコードが実行されますafterテスト関数自体が完了しました。 async()
を使用すると、テストを完了したものとして扱う前に、PromiseとObservableが完了するのを待つ必要があることをテストフレームワークに認識させます。
こちらもご覧ください