Решение проблем
Упс, что-то пошло не так? Используйте это руководство для решения проблем с Jest.
Тесты завершаются с ошибкой, и вы не знаете почему
Попробуйте использовать поддержку отладки, встроенную в Node.js. Примечание: это будет работать только в Node.js 8 и выше.
Вставьте инструкцию debugger; в любой из ваших тестов, а затем в каталоге вашего проекта запустите:
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here] or on Windows node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
Это запустит Jest в процессе Node.js, к которому сможет подключиться внешний отладчик. Обратите внимание, что процесс будет приостановлен до подключения отладчика.
Для отладки в Google Chrome (или любом браузере на основе Chromium) откройте свой браузер и перейдите к chrome://inspect и нажмите «Открыть специализированные инструменты разработчика для Node», что даст вам список доступных экземпляров node, к которым вы можете подключиться. Нажмите на адрес, отображаемый в терминале (обычно что-то вроде localhost:9229) после выполнения вышеприведённой команды, и вы сможете отладить Jest с помощью инструментов разработчика Chrome.
Инструменты разработчика Chrome отобразятся, и точка останова будет установлена на первой строке скрипта командной строки Jest (это делается, чтобы дать вам время открыть инструменты разработчика и предотвратить выполнение Jest, прежде чем у вас будет время сделать это). Нажмите кнопку, которая выглядит как кнопка «воспроизведения» в правом верхнем углу экрана, чтобы продолжить выполнение. Когда Jest выполнит тест, содержащий инструкцию debugger, выполнение приостановится, и вы сможете изучить текущую область видимости и стек вызовов.
Примечание: опция командной строки
--runInBandгарантирует, что Jest выполняет тест в том же процессе, а не создаёт процессы для отдельных тестов. Обычно Jest параллелизует выполнение тестов через процессы, но трудно отлаживать много процессов одновременно.
Отладка в VS Code
Существует несколько способов отладки тестов Jest с помощью встроенного отладчика Visual Studio Code.
Для подключения встроенного отладчика запустите тесты, как описано выше:
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here] or on Windows node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
Затем подключите отладчик VS Code, используя следующую конфигурацию launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229
}
]
}
Для автоматического запуска и подключения к процессу, выполняющему ваши тесты, используйте следующую конфигурацию:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/.bin/jest",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
или следующую для Windows:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/jest/bin/jest.js",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
Если вы используете create-react-app от Facebook, вы можете отладить свои тесты Jest с помощью следующей конфигурации:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
"args": [
"test",
"--runInBand",
"--no-cache",
"--env=jsdom",
"--watchAll=false"
],
"cwd": "${workspaceRoot}",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
Дополнительную информацию об отладке Node.js можно найти здесь.
Отладка в WebStorm
WebStorm имеет встроенную поддержку Jest. Подробнее читайте в статье «Testing With Jest in WebStorm».
Проблемы с кэшированием
Скрипт преобразования был изменён или Babel был обновлён, но изменения не распознаются Jest?
Повторите попытку с --no-cache. Jest кэширует преобразованные файлы модулей, чтобы ускорить выполнение тестов. Если вы используете собственный пользовательский преобразователь, рассмотрите добавление функции getCacheKey в него: getCacheKey в Relay.
Неразрешённые промисы
Если промис вообще не разрешается, может быть выброшено это сообщение об ошибке:
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.`
Чаще всего это вызвано конфликтом реализаций промисов. Попробуйте заменить глобальную реализацию промиса своей собственной, например, globalThis.Promise = jest.requireActual('promise'); и/или объединить используемые библиотеки промисов в одну.
Если ваш тест длительный, вы можете увеличить время ожидания, вызвав jest.setTimeout.
jest.setTimeout(10000); // 10 second timeout
Проблемы с Watchman
Попробуйте запустить Jest с --no-watchman или установите параметр конфигурации watchman в false.
Также см. страничку с решением проблем Watchman.
Тесты очень медленные в Docker и/или на сервере непрерывной интеграции (CI)
Хотя Jest в большинстве случаев очень быстр на современных многоядерных компьютерах с быстрыми SSD, он может быть медленным на определённых установках, как обнаружили наши пользователи здесь и здесь.
Основываясь на наблюдениях, один из способов решения этой проблемы и увеличения скорости до 50% — запустить тесты последовательно.
Для этого можно запустить тесты в одной потоке, используя --runInBand:
# Using Jest CLI jest --runInBand # Using yarn test (e.g. with create-react-app) yarn test --runInBand
Ещё один способ ускорить выполнение тестов на серверах непрерывной интеграции, таких как Travis-CI, — установить максимальный пул потоков примерно на 4. В частности, на Travis-CI это может вдвое сократить время выполнения тестов. Примечание: бесплатный план Travis CI, доступный для проектов с открытым исходным кодом, включает только 2 ядра процессора.
# Using Jest CLI jest --maxWorkers=4 # Using yarn test (e.g. with create-react-app) yarn test --maxWorkers=4
Если вы используете GitHub Actions, вы можете использовать github-actions-cpu-cores для определения количества процессоров и передачи этого значения в Jest.
- name: Get number of CPU cores
id: cpu-cores
uses: SimenB/github-actions-cpu-cores@v1
- name: run tests
run: yarn jest --max-workers ${{ steps.cpu-cores.outputs.count }}
Ещё один способ — использовать флаг shard для параллелизации выполнения тестов на нескольких машинах.
coveragePathIgnorePatterns кажется неэффективным.
Убедитесь, что вы не используете плагин babel-plugin-istanbul. Jest использует Istanbul, и поэтому также сообщает Istanbul, какие файлы нужно инструментировать для сбора данных о покрытии. При использовании babel-plugin-istanbul, каждый файл, обработанный Babel, будет содержать код для сбора данных о покрытии, поэтому он не игнорируется coveragePathIgnorePatterns.
Определение тестов
Для того, чтобы Jest мог собрать ваши тесты, они должны быть определены синхронно.
В качестве примера, демонстрирующего, почему это необходимо, предположим, что мы написали тест следующим образом:
// Don't do this it will not work
setTimeout(() => {
it('passes', () => expect(1).toBe(1));
}, 0);
Когда Jest выполняет ваш тест для сбора test , он не найдёт их, потому что мы определили его выполнение асинхронно в следующем такте цикла событий.
Примечание: это означает, что при использовании test.each вы не можете задать таблицу асинхронно внутри beforeEach / beforeAll.
Всё ещё не удалось решить?
См. Помощь.
© 2022 Facebook, Inc.
Licensed under the MIT License.
https://jestjs.io/docs/troubleshooting