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
якщо вам потрібно зруйнувати його чисто. Це забезпечує ізоляцію тесту: кожен тест починається з відомого стану і не залежить від наявності або відсутності попереднього тесту для успіху.