Выполнение набора действий перед каждым тестовым файлом в мокко

Недавно я начал работать с моккой для тестирования моего сервера expressjs. Мои тесты разделены на несколько файлов, и большинство из них содержат некоторые дублированные сегменты (чаще всего перед операциями, которые загружают все приборы в базу данных и т.д.), И это очень раздражает.

Я предполагаю, что могу экспортировать их все в один файл и импортировать их на каждый тест, но мне интересно, есть ли еще более элегантные решения - например, запуск определенного файла, который имеет все команды настройки, и другой файл, который содержит все команды срывания.

Если кто-нибудь знает ответ, который был бы потрясающим:)

Ответ 1

Существует три основных уровня выделения общей функциональности для тестов мокко. Если вы хотите загрузить несколько осветителей один раз для нескольких тестов (и вы написали каждый тест как независимый), используйте функцию before для загрузки осветителей вверху файла. Вы также можете использовать функцию beforeEach если вам нужно каждый раз beforeEach приборы.

Второй вариант (связанный) заключается в том, чтобы вытащить общую функциональность в отдельный файл или набор файлов и потребовать этот файл.

Наконец, обратите внимание, что у mocha есть хук корневого уровня:

Вы также можете выбрать любой файл и добавить "корневые" хуки -level. Например, добавьте beforeEach() вне всех блоков description(). Это приведет к тому, что обратный вызов метода beforeEach() будет выполняться перед любым тестовым примером, независимо от того, в каком файле он находится (это потому, что Mocha имеет подразумеваемый блок description(), называемый "корневым набором").

Мы используем это для запуска сервера Express один раз (и мы используем переменную среды, чтобы он работал на другом порту, чем наш сервер разработки):

before(function () {
  process.env.NODE_ENV = 'test';
  require('../../app.js');
});

(Нам не нужен метод done() потому что require является синхронным.) Это так, сервер запускается ровно один раз, независимо от того, сколько разных тестовых файлов включает этот корень -level before функцией.

Преимущество такого разделения состоит в том, что мы можем запустить npm test который запускает все тесты, или запустить mocha для любого конкретного файла или любой конкретной папки, или любого конкретного теста или набора тестов (используя it.only и description.only ) и все необходимые условия для выбранных тестов будут выполнены.

Ответ 2

Почему бы не mocha -r <module> или даже использовать mocha.opts?

Сделайте свой общий файл, скажем, init.js, а затем запустите

mocha -r `./init`

Это приведет к запуску mocha и загрузке ./init.js перед загрузкой любого из тестовых файлов mocha.

Вы также можете поместить его в mocha.opts внутри своего каталога тестов и иметь его содержимое

--require ./init