Это решение, которое сработало для меня. Это потребовало небольшого количества рефакторинга, но я думаю, что это было чище в конце. В моей экосистеме мы используем Parse Server в качестве промежуточного программного обеспечения с сервером Express, но это может относиться к любому, кому нужно запустить отдельный сервер с тестами.
Таким образом, чтобы мой сервер находился в месте, которое nyc
(используемый мной инструмент отчетов о покрытии) мог отслеживать, я полностью абстрагировал инициализацию сервера из набора jest test и создал специальный скрипт npm для запуска его в совершенно отдельном процессе.
Сценарий NPM(package.json):
"scripts": {
"coverage": "nyc --silent npm start & ./listen_on_port_5000.sh && jest test/cloud/integration && kill $(lsof -t -i tcp:5000) && nyc report --reporter=html",
}
listen_on_port_5000.sh
while ! nc -z localhost 5000
do
sleep 0.5
done
Так как же это работает?
nyc --silent npm start
работает, что является нормальнымКоманда, которую мы запустим, чтобы запустить наш сервер с Express и Parse, но с добавленной частью nyc
с флагом --silent
, чтобы nyc мог работать в фоновом режиме и наблюдать за кодом сервера. - Поскольку мы знаем, чтосервер всегда запускается через порт 5000, мы запускаем сценарий
start
в фоновом режиме и запускаем отдельный процесс, запускающий сценарий оболочки (listen_on_port_5000.sh
), чтобы дождаться загрузки сервера. - Как только сценарий прослушивателя обнаруживает, что что-либо работает на порту 5000, сценарий npm переходит к команде
jest
(все время, пока работает сервер Express). - Когда Jest завершает работу,final скрипт запускает скрипт
kill
, чтобы закрыть сервер, работающий на порту 5000. - Затем мы запускаем второй скрипт
nyc
, чтобы сгенерировать отчет, собранный в первом скрипте. Сгенерированный отчет можно найти в каталоге вашего проекта в /coverage/lcov-report/
(или вы можете использовать другой репортер покрытия .