before()
é executado uma vez antes de todos os testes em a describe
after()
ser executado uma vez após todos os testes em a describe
beforeEach()
serem executados antes de cada teste em a describe
afterEach()
ser executado após cada teste em umdescribe
Qual você deseja usar depende do seu teste real.
Agora, para a longa explicação. Se você correr mocha -R min
neste:
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");
});
});
Você verá algo como (Omiti a saída que não é relevante):
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
A única coisa que pode ser surpreendente se você olhar para o que é executado antes e depois de cada um dos testes no subnível é que ambos os beforeEach
retornos de chamada no nível superior e no subnível são chamados. A mesma coisa para o afterEach
.
Alguns também são surpreendidos pela sequência sublevel before
, top beforeEach
, sublevel beforeEach
. Eles pensam que todos os ganchos em um escopo externo deve executar antes de todos os ganchos em um âmbito interno, por isso eles esperam que a sequência: top beforeEach
, sublevel before
, sublevel beforeEach
. No entanto, a ordem em que o Mocha executa os ganchos faz todo o sentido: um before
gancho serve para preparar o cenário para um grupo de testes, enquanto um beforeEach
teste é para cada teste individual. Quando o Mocha executa um teste, todos os before
e os beforeEach
ganchos que foram definidos no describe
que o contém, e todos os ancestrais que se describe
aplicam ao teste. O Mocha executará cada before
gancho do escopo externo para o interno, e todos os beforeEach
ganchos do escopo externo para o interno. Contudo, todos os before
ganchos que se aplicam são executados antes de qualquer beforeEach
gancho. Isso explica a ordem acima: sublevel before
executa antes top beforeEach
porque é um before
gancho. E com after
e afterEach
, a mesma lógica se aplica, mas a ordem é invertida: todos os afterEach
ganchos que se aplicam são executados antes de qualquer after
gancho.
Observe também que Mocha não se preocupa com a forma como ordenei minhas it
chamadas em relação à describe
chamada no nível superior describe
. Ele executa top test1
, top test2
e depois os testes de subnível, mesmo que a ordem que dei foi top test1
, depois os testes de subnível e então top test2
.
O que você deseja usar entre before
, beforeEach
etc. depende realmente das especificações de seus testes. Se você precisa configurar um objeto mock ou estrutura de dados e este objeto ou estrutura pode ser reutilizado por todos os testes em um único describe
, você pode usar before
para configurá-lo e after
derrubá-lo. Esse pode ser o caso se você estiver fazendo testes somente leitura na estrutura. Se todos os seus testes apenas lêem, não há necessidade de criá-lo continuamente. Se cada teste em sua describe
precisa de uma nova cópia da estrutura porque cada teste está modificando a estrutura, você deve usar beforeEach
para criar a estrutura novamente para cada teste e, em seguida,afterEach
se você precisar derrubá-lo de forma limpa. Isso garante o isolamento do teste: cada teste começa em um estado conhecido e não depende da presença ou ausência de um teste anterior para ter sucesso.