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?