¿Cuál es la diferencia entre `before ()` y `beforeEach ()`?


90

¿Cuál es la diferencia entre específicamente Mocha 's before(), y beforeEach()? (Misma pregunta para after()y afterEach().)

Supongo que se before()ejecuta una vez por describe()bloque y se beforeEach()ejecuta una vez por prueba ( it()bloque). ¿Es eso cierto?

¿Y cuándo elegiría usar uno sobre el otro?

Respuestas:


188

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 minen 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 beforeEachdevoluciones 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 beforegancho está destinado a preparar el escenario para un grupo de pruebas, mientras que una beforeEachprueba es para cada prueba individual. Cuando Mocha ejecuta una prueba, todos los beforey los beforeEachganchos que se establecieron en el describeque lo contiene, y todos los ancestros de ese se describeaplican a la prueba. Mocha ejecutará cada beforegancho desde el alcance más externo hasta el más interno, y todos los beforeEachganchos desde el alcance más externo hasta el más interno. sin embargo, todos los beforeganchos que se aplican se ejecutan antes que cualquier beforeEachgancho. Esto explica el orden anterior: se sublevel beforeejecuta antes top beforeEachporque es un beforegancho. Y con aftery afterEach, se aplica la misma lógica pero el orden se invierte: todos los afterEachganchos que se aplican se ejecutan antes que cualquier aftergancho.

También observe que a Mocha no le importa cómo ordené mis itllamadas en relación con la describellamada en el nivel superior describe. Se ejecuta top test1, top test2y 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, beforeEachetc. 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 beforepara configurarlo y afterderribarlo. 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 describenecesita una nueva copia de la estructura porque cada prueba está modificando la estructura, entonces debe usar beforeEachpara crear la estructura de nuevo para cada prueba y luegoafterEachsi 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.


1
Genial, gracias. Mi pregunta fue en parte qué y en parte por qué, esto clava ambos, especialmente la distinción entre lectura / escritura.
ericsoco
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.