Tidak ada urutan pengaturan default tentang cara Mocha memuat file pengujian.
Saat Mocha memindai direktori
untuk mencari file nya menggunakan fs.readdirSync
. Panggilan ini adalah pembungkus readdir(3)
, yang dengan sendirinya tidak menjamin ketertiban. Sekarang, karena kekhasan implementasi
keluaran fs.readdir
dan fs.readdirSync
diurutkan pada Linux (dan mungkin sistem POSIX secara umum) tetapi tidak pada Windows . Selain itu, ada kemungkinan bahwa perilaku yang diurutkan di Linux pada akhirnya dapat dihapus karena dokumentasinya mengatakan fs.readdir
hanya readdir(3)
dan yang terakhir tidak menjamin ketertiban. Ada argumen yang bagus untuk dibuat bahwa perilaku yang diamati di Linux adalah bug (lihat masalah yang saya tautkan di atas).
Perhatikan bahwa ada --sort
opsi yang akan mengurutkan file setelah Mocha menemukannya. Tapi ini tidak aktif secara default.
Perilaku yang Anda amati dapat dijelaskan tidak hanya dengan memuat perintah tetapi dengan perintah eksekusi . Inilah yang terjadi:
-
Mocha memuat file uji dan menjalankannya. Jadi apa pun yang ada di tingkat atas file Anda akan dieksekusi segera . Ini berarti bahwa kode di
test_helper.js
langsung dieksekusi. Setiap panggilan untukdescribe
segera mengeksekusi panggilan baliknya. Namun, panggilan keit
rekam tes untuk eksekusi nanti. Mocha menemukan pengujian Anda saat melakukan ini tetapi tidak mengeksekusi mereka segera. -
Setelah semua file dieksekusi, Mocha mulai menjalankan tes. Saat ini, kode di
test_helper.js
telah berjalan dan pengujian Anda mendapat manfaat dari koneksi yang dibuatnya.
Peringatan utama Menghubungkan ke database adalah operasi asinkron, dan saat ini tidak ada yang menjamin bahwa operasi asinkron di test_helper.js
akan selesai sebelum tes dimulai. Bahwa itu berfungsi dengan baik sekarang hanyalah keberuntungan.
Jika ini saya, saya akan menempatkan pembuatan koneksi dalam before
kait. (Sebuah global before
hook yang muncul di file pengujian apa pun akan dieksekusi sebelum pengujian apa pun, bahkan pengujian yang muncul di file lain. ) Atau saya akan menggunakan --delay
dan secara eksplisit memanggil run()
untuk memulai suite setelah koneksi dijamin dibuat.