У чому різниця між `before ()` і `beforeEach ()`?


90

Що конкретно різниця між Мокко «s before()і beforeEach()? (Те саме питання для after()та afterEach().)

Я припускаю, що before()запускається один раз за describe()блок, і beforeEach()запускається один раз за тест ( it()блок). Це правда?

І коли я вибрав би використовувати одне над іншим?

Відповіді:


188

before()запускається один раз перед тим, як усі тести в a describe
after()   запускаються один раз після того, як всі тести в a describe
beforeEach()запускаються перед тим, як кожен тест в a describe
afterEach()   запускається після кожного тесту в adescribe

Який із них ви хочете використовувати, залежить від вашого фактичного тесту.

Тепер, для довгого пояснення. Якщо ви працюєте mocha -R minна цьому:

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

Ви побачите щось на зразок (я пропустив вихід, який не має значення):

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

Справа в тому, що може бути дивно , якщо подивитися на те , що виконується до і після кожного з випробувань на підрівні є те , що обидва ці beforeEachзворотні виклики на рівні верхньої і на підрівні називаються. Те саме для afterEach.

Деякі з них також здивовані послідовністю sublevel before, top beforeEach, sublevel beforeEach. Вони думають , що все гачки в зовнішній області повинні виконуватися перед усіма гачками у внутрішньому обсязі, тому вони очікують , що послідовність: top beforeEach, sublevel before, sublevel beforeEach. Однак порядок, в якому Мокка виконує гачки, має повний сенс: beforeгачок призначений створити сцену для групи тестів, тоді як beforeEachтест - для кожного окремого тесту. Коли Мокко виконують тест, все beforeі beforeEachгачки , які були встановлені в describeтому , що його містить, і все предки , які describeзастосовуються до випробування. Мокко виконає кожен beforeгачок від зовнішньої області до внутрішньої, і весь beforeEachгачок від зовнішньої області до внутрішньої. Однак, всі beforeгачки, що застосовуються, виконуються перед будь-яким beforeEachгачком. Це пояснює наведений вище порядок: sublevel beforeвиконується раніше, top beforeEachоскільки це beforeгачок. І з afterі afterEach, застосовується та сама логіка, але порядок зворотний: усі afterEachзастосовані хуки виконуються перед будь-яким afterгачком.

Також зауважте, що Mocha не хвилює, як я впорядковував свої itдзвінки щодо describeдзвінка на верхньому рівні describe. Він виконує top test1, top test2а потім тести на підрівні, хоча замовлення, яке я дав, було top test1, потім тести на підрівні, а потім top test2.

Те , що ви хочете використовувати серед before, beforeEachі т.д. дійсно залежить від специфіки ваших тестів. Якщо вам потрібно налаштувати фіктивний об’єкт або структуру даних, і цей об’єкт або структура можуть бути використані повторно всіма тестами в одному describe, ви можете використати beforeдля його налаштування та afterзнесення. Це може бути так, якщо ви виконуєте тести лише на читання на структурі. Якщо всі ваші тести лише читають його, тоді немає необхідності створювати його знову і знову. Якщо для кожного тесту вам describeпотрібна нова копія структури, оскільки кожен тест модифікує структуру, вам слід використовувати beforeEachдля створення структури заново для кожного тесту, а потімafterEachякщо вам потрібно зруйнувати його чисто. Це забезпечує ізоляцію тесту: кожен тест починається з відомого стану і не залежить від наявності або відсутності попереднього тесту для успіху.


1
Чудово, дякую. Моє запитання полягало в тому, що і чому, це нігті обидва, особливо різниця між читанням / записом.
ericsoco
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.