async
tidak akan mengizinkan pengujian berikutnya untuk memulai hingga async
menyelesaikan semua tugasnya. Apa yang async
dilakukan adalah membungkus callback dalam Zona, di mana semua tugas asinkron (misalnya setTimeout
) dilacak. Setelah semua tugas asinkron selesai, maka async
selesai.
Jika Anda pernah bekerja dengan Jasmine di luar Angular, Anda mungkin pernah melihat done
diteruskan ke panggilan balik
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Di sini, ini Jasmine asli, di mana kami memberi tahu Jasmine bahwa tes ini harus menunda penyelesaian sampai kami menelepon done()
. Jika kami tidak menelepon done()
dan malah melakukan ini:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
Pengujian akan selesai bahkan sebelum ekspektasi, karena promise diselesaikan setelah pengujian selesai menjalankan tugas sinkron.
Dengan Angular (di lingkungan Jasmine), Angular akan benar-benar memanggil di done
belakang layar saat kita menggunakan async
. Ini akan melacak semua tugas asinkron di Zone, dan ketika semuanya selesai, done
akan dipanggil di belakang layar.
Dalam kasus khusus Anda dengan TestBed
konfigurasi, Anda akan menggunakan ini secara umum bila Anda mau compileComponents
. Saya jarang mengalami situasi di mana saya harus menyebutnya sebaliknya
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
Saat menguji komponen yang menggunakan templateUrl
(jika Anda tidak menggunakan webpack), Angular perlu membuat permintaan XHR untuk mendapatkan template, sehingga kompilasi komponen akan asinkron. Jadi kita harus menunggu sampai selesai sebelum melanjutkan pengujian.
async
tidak perlu. Saat Anda menggunakantemplateUrl
, itu. Namun, memasukkanasync
tidak akan "merusak" komponen template-sebaris. Apakah menurut Anda aman untuk mengatakan bahwa satu default dapat digunakanasync
untuk setiap pengujian?compileComponents
. Tidak ada hubungannya dengan penggunaanasync
pada setiap tes jika itu yang Anda tanyakan. Sejauh aman (kapan Anda harus meneleponcompileComponents
), lihat Kapan saya harus menelepon compileComponentsngOnInit
komponen dipanggil. Terkadang hal ini penting saat pengujianSaat Anda membuat panggilan asinkron dalam pengujian Anda, fungsi pengujian yang sebenarnya selesai sebelum panggilan asinkron selesai. Saat Anda perlu memverifikasi beberapa status saat panggilan selesai (yang biasanya terjadi), framework pengujian akan melaporkan pengujian sebagai selesai sementara masih ada pekerjaan asinkron yang sedang berlangsung.
Dengan menggunakan,
async(...)
Anda memberi tahu framework pengujian untuk menunggu hingga janji pengembalian atau observable selesai sebelum memperlakukan pengujian sebagai selesai.Kode yang diteruskan ke
then(...)
akan dijalankan setelah fungsi pengujian itu sendiri selesai. Denganasync()
Anda membuat kerangka pengujian sadar, bahwa ia perlu menunggu janji dan observable selesai sebelum memperlakukan pengujian sebagai selesai.Lihat juga
sumber