Setup and Teardown
Часто при написании тестов вам нужно проделать некоторую работу до того, как запустится тест, и некоторую работу по его завершению. Jest предоставляет вспомогательные функции для этих целей.
#
Повторение подготовительной работы для нескольких тестовВ случае, когда вам нужно проделать одну и ту же работу для нескольких тестов, вы можете воспользоваться функциями beforeEach
и afterEach
.
К примеру, допустим, что несколько тестов взаимодействуют с базой городов. У вас есть метод initializeCityDatabase()
, который должен быть вызван перед каждым тестом, а также метод clearCityDatabase()
, который должен быть вызван после каждого из них. Это можно сделать следующим образом:
beforeEach
and afterEach
могут работать с асинхронным кодом также, как это делают асинхронные тесты - они могут либо принимать функцию done
в качестве параметра, либо возвращать promise. К примеру, if initializeCityDatabase()
возвращает promise, который вызывает resolve, когда база данных инициализирована, нам бы хотелось вернуть этот promise:
#
Единовременная настройкаВ некоторых случаях, подготовительные работы нужны единожды в начале файла. Особенно это касается случаев, когда подготовительный код исполняется асинхронно, и вы не можете просто заинлайнить его. Jest предоставляет функции beforeAll
и afterAll
на этот случай.
К примеру, если и initializeCityDatabase
и clearCityDatabase
каждый вернули promise, а база данных городов должна быть переиспользована между тестами, можно было бы изменить код так:
#
Определение контекстаПо умолчанию, блоки before
и after
применяются к каждому тесту в файле. Можно группировать тесты вместе, используя блок describe
. Для тестов внутри describe
блока, блоки before
и after
применяются только для тестов внутри этого блока describe
.
К примеру, допустим у нас есть не только база городов, но и база продовольствия. Мы могли бы организовать различную подготовку к разным тестам:
Обратите внимание, что beforeEach
, находящийся уровнем выше, выполнится до beforeEach
, находящегося внутри describe
блока. Пример ниже иллюстрирует последовательность выполнения всех блоков (хуков).
#
Последовательность выполнения блоков describe и testJest выполняет все обработчики describe
внутри одного файла до того, как будет запущен какой-либо тест. Это еще одна причина, чтобы проводить подготовительные и завершающие работы внутри обработчиков before*
и after*
, вместо того, чтобы описывать их внутри блоков describe
. Как только завершатся все describe
блоки, по умолчанию Jest запустит все тесты последовательно в том порядке, в котором они были обнаружены на этапе сбора, ожидая, пока каждый из них завершится и будет убран, прежде чем двигаться дальше.
Рассмотрим следующий пример тестового файла и результат его выполнения:
#
Общие рекомендацииЕсли ест падает, нужно проверить в первую очередь, что тест падает, будучи запущенным водиночку. В Jest это легко сделать: временно поменяйте команду test
на test.only
:
Если у вас есть тест, который часто падает при выполнении внутри набора тестов, но не падает будучи запущенным в одиночку, значит, что-то из другого теста мешает текущему. Часто это легко исправить, очищая общее состояние внутри функции beforeEach
. Если нет уверенности, нужно ли очищать общее для тестов состояние, можно воспользоваться beforeEach
для записи логов выполнения.