Apa perbedaan antara `before ()` dan `beforeEach ()`?

90

Apa yang secara khusus perbedaan antara Mocha 's before()dan beforeEach()? (Pertanyaan yang sama untuk after()dan afterEach().)

Saya berasumsi before()berjalan sekali per describe()blok, dan beforeEach()berjalan sekali per pengujian ( it()blok). Benarkah itu?

Dan kapan saya akan memilih untuk menggunakan salah satu dari yang lain?

ericsoco
sumber

Jawaban:

189

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 minini:

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 beforeEachcallback 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: beforehook dimaksudkan untuk mengatur panggung untuk sekelompok tes, sedangkan beforeEachtes untuk setiap tes individu. Ketika Mocha mengeksekusi ujian, semua beforedan beforeEachkait yang ditetapkan dalam describeyang berisi itu, dan semua nenek moyang yang describeberlaku untuk tes. Mocha akan mengeksekusi setiap beforepengait dari ruang lingkup terluar hingga terdalam, dan semua beforeEachpengait dari ruang lingkup terluar hingga terdalam. Namun, semua beforehook yang berlaku dieksekusi sebelum beforeEachhook apapun . Ini menjelaskan urutan di atas: sublevel beforedieksekusi sebelumnya top beforeEachkarena ini adalah beforehook. Dan dengan afterdan afterEach, logika yang sama berlaku tetapi urutannya dibalik: semua afterEachhook yang berlaku dieksekusi sebelum afterhook apa pun .

Juga perhatikan bahwa Mocha tidak peduli tentang bagaimana saya memesan itpanggilan saya relatif terhadap describepanggilan di tingkat atas describe. Itu dijalankan top test1, top test2dan 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 beforeuntuk menyiapkannya, dan aftermeruntuhkannya. 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 describememerlukan salinan baru dari struktur tersebut karena setiap pengujian memodifikasi struktur maka Anda harus menggunakan beforeEachuntuk membuat struktur baru untuk setiap pengujian dan kemudianafterEachjika 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.

Louis
sumber
1
Terima kasih banyak. Pertanyaan saya adalah bagian apa dan bagian mengapa, ini memaku keduanya, terutama perbedaan antara baca / tulis.
ericsoco