Qual'è la differenza tra `before ()` e `beforeEach ()`?


91

Qual è specificamente la differenza tra Mocha 's before()e beforeEach()? (Stessa domanda per after()e afterEach().)

Presumo che venga before()eseguito una volta per describe()blocco e beforeEach()venga eseguito una volta per test ( it()blocco). È vero?

E quando sceglierei di usarne uno sull'altro?

Risposte:


191

before()viene eseguito una volta prima che tutti i test in a describe
after()   venga eseguito una volta dopo che tutti i test in a describe
beforeEach()sono stati eseguiti prima che ogni test in a describe
afterEach()   venga eseguito dopo ogni test in adescribe

Quale si desidera utilizzare dipende dal test effettivo.

Ora, per la lunga spiegazione. Se corri mocha -R minsu questo:

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

Vedrai qualcosa del tipo (ho omesso l'output che non è rilevante):

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

La cosa che può sorprendere se si guarda a ciò che viene eseguito prima e dopo ogni test al sottolivello è che vengono chiamati sia i beforeEachcallback al livello superiore che quelli al sottolivello. Stessa cosa per il afterEach.

Alcuni sono anche sorpreso dalla sequenza sublevel before, top beforeEach, sublevel beforeEach. Essi pensano che tutti i ganci in un ambito esterno devono eseguire prima tutti i ganci in un ambito interno, in modo che si aspettano la sequenza: top beforeEach, sublevel before, sublevel beforeEach. Tuttavia, l'ordine in cui Mocha esegue gli hook ha perfettamente senso: un beforehook ha lo scopo di preparare il terreno per un gruppo di test, mentre un beforeEachtest è per ogni singolo test. Quando Mocha esegue un test, tutti i beforee gli beforeEachhook che sono stati impostati in quello describeche lo contiene e tutti gli antenati di quello si describeapplicano al test. Mocha eseguirà ogni beforehook dallo scope più esterno a quello più interno e tutti gli beforeEachhook dallo scope più esterno a quello più interno. però, tutti gli beforehook che si applicano vengono eseguiti prima di qualsiasi beforeEachhook. Questo spiega l'ordine sopra: sublevel beforeviene eseguito prima top beforeEachperché è un beforehook. E con aftere afterEach, si applica la stessa logica ma l'ordine è invertito: tutti gli afterEachhook che si applicano vengono eseguiti prima di qualsiasi afterhook.

Si noti inoltre che a Mocha non interessa come ho ordinato le mie itchiamate rispetto alla describechiamata nel livello superiore describe. Esegue top test1, top test2e poi le prove sottolivello, anche se l'ordine ho dato è stato top test1, poi le prove di sottolivello e poi top test2.

Ciò che si vuole utilizzare tra before, beforeEachecc realtà dipende la specificità del test. Se è necessario impostare un oggetto fittizio o una struttura dati e questo oggetto o struttura può essere riutilizzato da tutti i test in un unico describe, è possibile utilizzarlo beforeper configurarlo e aftersmontarlo. Questo potrebbe essere il caso se stai eseguendo test di sola lettura sulla struttura. Se tutti i tuoi test lo leggono solo, non è necessario crearlo più e più volte. Se ogni test nella tua describenecessita di una nuova copia della struttura perché ogni test sta modificando la struttura, allora dovresti usare beforeEachper creare di nuovo la struttura per ogni test e poiafterEachse hai bisogno di smontarlo in modo pulito. In questo modo si garantisce l'isolamento del test: ogni test inizia da uno stato noto e non dipende dalla presenza o dall'assenza di un test precedente per avere successo.


1
Ottimo grazie. La mia domanda era in parte cosa e in parte perché, questo inchioda entrambi, specialmente la distinzione tra lettura / scrittura.
ericsoco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.