Хуки: beforeEach, afterEach, beforeAll, afterAll
Урок объясняет хуки жизненного цикла, которые готовят и убирают состояние вокруг тестов.
Хук — функция, которую Jest вызывает автоматически до или после тестов, чтобы подготовить или очистить окружение.
Зачем хуки
Часто перед каждым тестом нужно одно и то же: создать свежий объект, очистить базу, сбросить счётчик. Дублировать это в каждом it — плохо. Хуки выносят повторяющуюся подготовку в одно место.
Четыре хука
| Хук | Когда вызывается |
beforeAll | один раз перед всеми тестами блока |
beforeEach | перед каждым тестом |
afterEach | после каждого теста |
afterAll | один раз после всех тестов блока |
Типичный пример
describe('Корзина', () => {
let cart;
beforeEach(() => {
cart = new Cart(); // свежая корзина перед КАЖДЫМ тестом
});
it('пустая корзина стоит 0', () => {
expect(cart.total()).toBe(0);
});
it('добавление товара увеличивает сумму', () => {
cart.add({ price: 100 });
expect(cart.total()).toBe(100);
});
});Благодаря beforeEach второй тест не видит изменений первого: каждый стартует с чистой корзиной.
Порядок выполнения
Проиллюстрируем порядок вызова хуков живым логом:
const log = [];
function beforeAll(fn) { fn('beforeAll'); }
function runTest(name, before, after, test) {
before('beforeEach');
test(name);
after('afterEach');
}
beforeAll(label => log.push(label));
['тест A', 'тест B'].forEach(name => {
runTest(name,
label => log.push(label),
label => log.push(label),
n => log.push(' ' + n));
});
log.push('afterAll');
console.log(log.join('\n'));Вывод:
beforeAll beforeEach тест A afterEach beforeEach тест B afterEach afterAll
Видно: beforeAll и afterAll срабатывают по одному разу на краях, а beforeEach/afterEach оборачивают каждый тест.
beforeAll против beforeEach
beforeEach — для свежего состояния под каждый тест (изоляция). beforeAll — для дорогой одноразовой подготовки, которую не нужно повторять (например, поднять тестовый сервер). Очистку в afterEach/afterAll делают, чтобы один тест не «протекал» в другой.
Итог
- Хуки выносят повторяющуюся подготовку/очистку из тестов.
beforeEach/afterEach— вокруг каждого теста;beforeAll/afterAll— один раз на блок.beforeEachобеспечивает свежее состояние и изоляцию.- Дорогую одноразовую подготовку выносят в
beforeAll.