before()
dijalankan sekali sebelum semua pengujian di a describe
after()
dijalankan satu kali setelah semua pengujian di a describe
beforeEach()
dijalankan sebelum setiap pengujian di a describe
afterEach()
dijalankan setelah setiap pengujian di adescribe
Yang mana yang ingin Anda gunakan bergantung pada pengujian Anda yang sebenarnya.
Sekarang, untuk penjelasan panjangnya. Jika Anda menjalankan mocha -R min
ini:
describe("top", function () {
before(function () {
console.log("top before");
});
after(function () {
console.log("top after");
});
beforeEach(function () {
console.log("top beforeEach");
});
afterEach(function () {
console.log("top afterEach");
});
it("test1", function () {
console.log("top test1");
});
describe("sublevel", function() {
before(function () {
console.log("sublevel before");
});
after(function () {
console.log("sublevel after");
});
beforeEach(function () {
console.log("sublevel beforeEach");
});
afterEach(function () {
console.log("sublevel afterEach");
});
it("test1", function () {
console.log("sublevel test1");
});
it("test2", function () {
console.log("sublevel test2");
});
});
it("test2", function () {
console.log("top test2");
});
});
Anda akan melihat sesuatu seperti (Saya telah menghilangkan output yang tidak relevan):
top before
top beforeEach
top test1
top afterEach
top beforeEach
top test2
top afterEach
sublevel before
top beforeEach
sublevel beforeEach
sublevel test1
sublevel afterEach
top afterEach
top beforeEach
sublevel beforeEach
sublevel test2
sublevel afterEach
top afterEach
sublevel after
top after
Hal yang mungkin mengejutkan jika Anda melihat apa yang mengeksekusi sebelum dan sesudah masing-masing tes di sublevel adalah bahwa kedua yang beforeEach
callback di tingkat atas dan di sublevel yang disebut. Hal yang sama untuk afterEach
.
Beberapa juga terkejut dengan urutan sublevel before
, top beforeEach
, sublevel beforeEach
. Mereka berpikir bahwa semua kait dalam lingkup luar harus dijalankan sebelum semua kait dalam lingkup batin, sehingga mereka berharap urutan: top beforeEach
, sublevel before
, sublevel beforeEach
. Namun, urutan di mana Mocha mengeksekusi hook sangat masuk akal: before
hook dimaksudkan untuk mengatur panggung untuk sekelompok tes, sedangkan beforeEach
tes untuk setiap tes individu. Ketika Mocha mengeksekusi ujian, semua before
dan beforeEach
kait yang ditetapkan dalam describe
yang berisi itu, dan semua nenek moyang yang describe
berlaku untuk tes. Mocha akan mengeksekusi setiap before
pengait dari ruang lingkup terluar hingga terdalam, dan semua beforeEach
pengait dari ruang lingkup terluar hingga terdalam. Namun, semua before
hook yang berlaku dieksekusi sebelum beforeEach
hook apapun . Ini menjelaskan urutan di atas: sublevel before
dieksekusi sebelumnya top beforeEach
karena ini adalah before
hook. Dan dengan after
dan afterEach
, logika yang sama berlaku tetapi urutannya dibalik: semua afterEach
hook yang berlaku dieksekusi sebelum after
hook apa pun .
Juga perhatikan bahwa Mocha tidak peduli tentang bagaimana saya memesan it
panggilan saya relatif terhadap describe
panggilan di tingkat atas describe
. Itu dijalankan top test1
, top test2
dan kemudian tes sublevel, meskipun urutan yang saya berikan adalah top test1
, kemudian tes sublevel dan kemudian top test2
.
Apa yang ingin Anda gunakan antara before
, beforeEach
, dll benar-benar tergantung pada spesifikasi tes Anda. Jika Anda perlu menyiapkan objek tiruan atau struktur data dan objek atau struktur ini dapat digunakan kembali oleh semua pengujian dalam satu pengujian describe
, Anda dapat menggunakannya before
untuk menyiapkannya, dan after
meruntuhkannya. Ini bisa terjadi jika Anda melakukan tes hanya-baca pada struktur. Jika semua pengujian Anda hanya membacanya, maka tidak perlu membuatnya berulang kali. Jika setiap pengujian dalam Anda describe
memerlukan salinan baru dari struktur tersebut karena setiap pengujian memodifikasi struktur maka Anda harus menggunakan beforeEach
untuk membuat struktur baru untuk setiap pengujian dan kemudianafterEach
jika Anda perlu meruntuhkannya dengan bersih. Melakukan hal ini memastikan isolasi pengujian: setiap pengujian dimulai dari status yang diketahui dan tidak bergantung pada ada atau tidaknya pengujian sebelumnya agar berhasil.