Spec-Zone.ru › Jest

Решение проблем

Упс, что-то пошло не так? Используйте это руководство для решения проблем с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API