`` Before () '' ve `beforeEach ()` arasındaki fark nedir?


91

Mocha 'nın before()ve arasındaki fark tam olarak nedir beforeEach()? (İçin aynı soru after()ve afterEach().)

Blok before()başına bir kez çalıştığını describe()ve beforeEach()test ( it()blok) başına bir kez çalıştığını varsayıyorum . Bu doğru mu?

Ve ne zaman birini diğerine tercih ederim?

Yanıtlar:


191

before()önce bir kez çalıştırılan tüm bir de testlerde describe
after()   bir kez çalıştırıldıktan sonra tüm bir de testlerden describe
beforeEach()önce çalıştırılan her bir test describe
afterEach()   sonrasında çalıştırılan her a'da testidescribe

Hangisini kullanmak istediğiniz gerçek testinize bağlıdır.

Şimdi, uzun açıklama için. Bunun mocha -R minüzerine koşarsanız:

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");
    });
});

Şöyle bir şey göreceksiniz (Alakalı olmayan çıktıyı atladım):

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

Önce ve tonlarca de testlerin her birinden sonra yürütür neyi bakarsak şaşırtıcı olabilir şey olduğunu hembeforeEach üst düzeyde ve Sublevel de geri aramaları denir. İçin aynı şey afterEach.

Bazılarında sekansı tarafından sürpriz edilir sublevel before, top beforeEach, sublevel beforeEach. : Onlar bir dış kapsamındaki tüm kancalar onlar diziyi bekliyoruz, böylece bir iç kapsamındaki tüm kanca önce yürütmek gerektiğini düşünüyorum top beforeEach, sublevel before, sublevel beforeEach. Bununla birlikte, Mocha'nın kancaları yürütme sırası tamamen anlamlıdır: bir beforekanca, bir grup test için aşamayı belirlerken, beforeEachher bir test için bir test vardır. Mocha bir test yürütür, tüm beforeve beforeEachset edilmiş kancalar describebunu ihtiva ettiği ve her ataları describedeneyi için de geçerlidir. Mocha, her beforekancayı en dıştaki kapsamdan en içteki kancaya ve en dış kapsamdan en içteki tüm beforeEachkancaları yürütecektir . ancak, beforegeçerli tüm kancalar herhangi bir beforeEachkancadan önce yürütülür . Bu, yukarıdaki sırayı açıklar: bir kanca olduğu için daha sublevel beforeönce yürütülür. Ve ile ve aynı mantık geçerlidir fakat sırası tersine: Bütün uygulamak kancalar herhangi önce yürütülür kanca.top beforeEachbeforeafterafterEachafterEachafter

Ayrıca, Mocha'nın itaramalarımı describeen üst seviyedeki aramaya göre nasıl sipariş ettiğimi umursamadığını da unutmayın describe. Bu çalıştırır top test1, top test2ve ardından tonlarca testleri, ben verdi emir olmasına rağmen top test1, daha sonra daha sonra alt düzey testleri ve top test2.

Ne arasından kullanmak istediğiniz before, beforeEachvb gerçekten testlerin özelliklerine bağlıdır. Eğer kurulum için sahte bir nesne veya veri yapısını ihtiyaç ve bu nesne veya yapı varsa olabilir tek tüm testler tarafından yeniden describekullanabileceğiniz beforekurmak ve afteronu yıkmaya. Yapı üzerinde salt okunur testler yapıyorsanız durum bu olabilir. Tüm testleriniz sadece okursa, tekrar tekrar oluşturmanıza gerek yoktur. Her test yapıyı değiştirdiği için her test yapının yeni bir kopyasına describeihtiyaç duyuyorsa, her test için yapıyı yeniden oluşturmak için kullanmalısınız ve sonrabeforeEachafterEachTemiz bir şekilde yırtmanız gerekiyorsa. Bunu yapmak, test izolasyonu sağlar: her test bilinen bir durumdan başlar ve başarılı olması için önceki bir testin varlığına veya yokluğuna bağlı değildir.


1
Harika teşekkür ederim. Benim sorum kısmen neyin kısmen neden olduğuydu, bu ikisi de, özellikle okuma / yazma arasındaki ayrım.
ericsoco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.