before()
se ejecuta una vez antes de que todas las pruebas en a describe
after()
se ejecuten una vez después de que se ejecuten todas las pruebas en a describe
beforeEach()
antes de que se ejecute cada prueba en a describe
afterEach()
después de cada prueba en adescribe
El que desee utilizar depende de su prueba real.
Ahora, para la larga explicación. Si se ejecuta mocha -R min
en esto:
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");
});
});
Verá algo como (he omitido la salida que no es 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
Lo que puede resultar sorprendente si observa lo que se ejecuta antes y después de cada una de las pruebas en el subnivel es que se llaman tanto las beforeEach
devoluciones de llamada en el nivel superior como en el subnivel. Lo mismo para el afterEach
.
Algunos también están sorprendidos por la secuencia sublevel before
, top beforeEach
, sublevel beforeEach
. Ellos piensan que todos los ganchos en un ámbito exterior debe ejecutar antes de que todos los ganchos en un ámbito interno, por lo que esperan que la secuencia: top beforeEach
, sublevel before
, sublevel beforeEach
. Sin embargo, el orden en el que Mocha ejecuta los ganchos tiene mucho sentido: un before
gancho está destinado a preparar el escenario para un grupo de pruebas, mientras que una beforeEach
prueba es para cada prueba individual. Cuando Mocha ejecuta una prueba, todos los before
y los beforeEach
ganchos que se establecieron en el describe
que lo contiene, y todos los ancestros de ese se describe
aplican a la prueba. Mocha ejecutará cada before
gancho desde el alcance más externo hasta el más interno, y todos los beforeEach
ganchos desde el alcance más externo hasta el más interno. sin embargo, todos los before
ganchos que se aplican se ejecutan antes que cualquier beforeEach
gancho. Esto explica el orden anterior: se sublevel before
ejecuta antes top beforeEach
porque es un before
gancho. Y con after
y afterEach
, se aplica la misma lógica pero el orden se invierte: todos los afterEach
ganchos que se aplican se ejecutan antes que cualquier after
gancho.
También observe que a Mocha no le importa cómo ordené mis it
llamadas en relación con la describe
llamada en el nivel superior describe
. Se ejecuta top test1
, top test2
y luego las pruebas de subnivel, aunque la orden que di fue top test1
, luego las pruebas de subnivel y luego top test2
.
Lo que quiera usar entre before
, beforeEach
etc. realmente depende de los detalles de sus pruebas. Si necesita configurar un objeto simulado o una estructura de datos y este objeto o estructura puede ser reutilizado por todas las pruebas en una sola describe
, puede usarlo before
para configurarlo y after
derribarlo. Este podría ser el caso si está realizando pruebas de solo lectura en la estructura. Si todas sus pruebas solo lo leen, entonces no es necesario crearlo una y otra vez. Si cada prueba en su describe
necesita una nueva copia de la estructura porque cada prueba está modificando la estructura, entonces debe usar beforeEach
para crear la estructura de nuevo para cada prueba y luegoafterEach
si necesita derribarlo limpiamente. Hacer esto asegura el aislamiento de la prueba: cada prueba comienza desde un estado conocido y no depende de la presencia o ausencia de una prueba anterior para tener éxito.