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 min
su 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 beforeEach
callback 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 before
hook ha lo scopo di preparare il terreno per un gruppo di test, mentre un beforeEach
test è per ogni singolo test. Quando Mocha esegue un test, tutti i before
e gli beforeEach
hook che sono stati impostati in quello describe
che lo contiene e tutti gli antenati di quello si describe
applicano al test. Mocha eseguirà ogni before
hook dallo scope più esterno a quello più interno e tutti gli beforeEach
hook dallo scope più esterno a quello più interno. però, tutti gli before
hook che si applicano vengono eseguiti prima di qualsiasi beforeEach
hook. Questo spiega l'ordine sopra: sublevel before
viene eseguito prima top beforeEach
perché è un before
hook. E con after
e afterEach
, si applica la stessa logica ma l'ordine è invertito: tutti gli afterEach
hook che si applicano vengono eseguiti prima di qualsiasi after
hook.
Si noti inoltre che a Mocha non interessa come ho ordinato le mie it
chiamate rispetto alla describe
chiamata nel livello superiore describe
. Esegue top test1
, top test2
e 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
, beforeEach
ecc 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 before
per configurarlo e after
smontarlo. 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 describe
necessita di una nuova copia della struttura perché ogni test sta modificando la struttura, allora dovresti usare beforeEach
per creare di nuovo la struttura per ogni test e poiafterEach
se 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.