Jest: отладчик; и точки останова не работают с node --inspect

Созданный на 9 сент. 2016  ·  77Комментарии  ·  Источник: facebook/jest

В настоящее время точки останова могут быть установлены для использования с node debug с использованием ключевого слова debugger; , но любые точки останова, установленные с помощью debugger; при использовании node --inspect , игнорируются. Это касается только тестового кода; точки останова, установленные с помощью debugger; в Jest или других библиотеках node_module, учитываются.

Я создал тестовый репозиторий, чтобы продемонстрировать разницу: https://github.com/snapwich/jest-inspect. Оба метода можно проверить, вытащив репо и запустив следующее:

npm install

// works
node debug --debug-brk ./node_modules/.bin/jest -i

// doesn't honor "debugger;"
node --inspect --debug-brk ./node_modules/.bin/jest -i

Кроме того, после начального выполнения с node --inspect точки останова могут быть применены к коду на вкладке «Источники». Любые точки останова, помещенные в тестовый код (например, __tests__/jest.js в репозитории jest-inspect выше), будут игнорироваться, но точки останова, помещенные в любые другие файлы (Jest или другой код node_modules), будут работать правильно при повторном запуске набора.

node --inspect доступен только в узле v6.3.0 +, и я работаю на OSX, используя узел v6.4.0 и npm v3.10.3

/ cc @kentcdodds

Bug Help Wanted

Самый полезный комментарий

node --inspect --inspect-brk node_modules/bin/jest должен работать с узлом 8.4.0 из коробки. Я так счастлив, что это наконец-то сработало, это была одна из основных проблем, из-за которой было трудно отлаживать тесты JavaScript.

Все 77 Комментарий

столкнуться с той же проблемой сегодня

Также в вашем примере, если я запустил npm run debug

  6
  7     // break won't be triggered
> 8     debugger;
  9
 10     expect(test).toBe(true);
test
ReferenceError: test is not defined

Я что-то делаю не так или у него нет доступа к контексту?

@maximderbin не уверен, почему вы получаете эту ReferenceError, test следует определить несколькими строками выше: https://github.com/snapwich/jest-inspect/blob/master/__tests__/jest. js # L5

edit - только что протестировано, вам нужно ввести repl перед вводом test чтобы код работал в правильном контексте.

Это интересно. Возможно ли, что флаг --debug узла не работает при использовании модуля vm для создания контекста?

Есть новости по этому поводу?

Это когда-нибудь работало раньше?

Я не думаю, что vm.runInContext поддерживает протокол отладчика.

В этой статье упоминается перенаправление портов для поддержки отладки кода виртуальной машины. Не уверен, что это актуально.

Помимо этого, возможно, можно использовать веб-сокеты в виртуальной машине (для поддержки протокола отладчика)?

Как ты думаешь, @cpojer?

возможно, можно запускать тесты без vm context в режиме отладки?

Эта проблема - самая большая причина, по которой я не могу переключиться на Jest. Есть новости или идеи о том, как добиться прогресса?

Я думаю, нам нужно создать репро без Jest и отправить проблему в багтрекер node.js.

Эта проблема NodeJS выглядит связанной: https://github.com/nodejs/node/issues/7593.

Репродукция минимальна:

var vm = require('vm');
new vm.Script('debugger;').runInContext(vm.createContext());
debugger;

Трижды сломается с node debug index.js но только дважды с node --inspect --debug-brk index.js

@cpojer, как вы думаете, стоит изменить содержимое http://facebook.github.io/jest/docs/troubleshooting.html#tests -are-failing-and-you-don-t-know-why, чтобы подумайте, что это еще не работает? Я с удовольствием отправлю PR для этого, если это будет полезно - что должно быть сказано в разделе? Удалите это? Скажите "скоро"?

(Кстати, я люблю Jest! Это делает тестирование React еще более крутым)

Я создал PR для обновления документации по этому поводу: https://github.com/facebook/jest/pull/1998

Похоже, что инспектор узлов больше не поддерживается и не поддерживает узел 7. *. Когда я использую
узел --debug-brk --inspect ./node_modules/react-scripts/node_modules/.bin/jest -i
С CRA и node 7.1 он, кажется, правильно загружается в инструментах разработчика, а затем зависает с «ожиданием отключения отладчика» (даже если выполнение бесплатное)

Привет, ребята, есть новости по этому поводу?

Платформа IntelliJ (IntelliJ IDEA, WebStorm) будет поддерживать Jest в следующем выпуске 2017.1 (https://youtrack.jetbrains.com/issue/WEB-14979). По умолчанию используется инспектор v8. Будет странно, если можно запустить, но не отладить.

Но это не проблема Jest - это проблема NodeJS. И есть простой обходной путь - если вы хотите отладить единственный тест, вам не нужно беспокоиться о глобальном состоянии. Итак, для этого я реализовал специальную тестовую среду:

  1. Установить модуль jest-environment-node-debug

    yarn add jest-environment-node-debug --dev
    

    или используя npm: npm install jest-environment-node-debug --save-dev

  2. Запуск с флагом --env jest-environment-node-debug

Отладка работает :)

(Положение строки иногда неверно в отладчике NodeJS платформы IntelliJ, если вы используете препроцессор TypeScript и Babel вместе - это не связанная проблема и будет исправлена ​​в версии 2017.1).

Мы с @orta буквально говорили об этом. Для него это работает в vscode, поэтому нам может не понадобиться среда отладки узлов. Я думаю, что --debug-brk и запуск Jest с -i будут работать.

Я ценю, что вы создали среду отладки, я бы так и поступил.

@cpojer V8 Inspector намного лучше, чем старый протокол отладчика v8 - из-за этого платформа IntelliJ Platform будет использовать инспектор V8 по умолчанию для NodeJS 7+. Так что для меня очень важно отлаживать шутку с помощью инспектора v8.

Думаю, имеет смысл ограничить это:

  • Jest запускает один тестовый файл
  • Это не в режиме просмотра

Одна из проблем заключается в том, что вы можете получить глобальную переменную, отличную от global которую мы передаем файлу, запускаемому в контексте Jest. Я действительно хотел бы выяснить, как команда узлов может исправить v8, это похоже на долгосрочное исправление :(

(Для заинтересованных я использую VS Code с этим запуском JSON)

 {
      "name": "Run Tests With Debugger (slower, use npm run watch for normal work)",
      "type": "node",
      "request": "launch",
      "port": 5858,
      "address": "localhost",
      "stopOnEntry": false,
      "runtimeExecutable": null,
      "runtimeArgs": [
        "--debug-brk",
        "./node_modules/.bin/jest",
        "-i"
      ],
      "cwd": "${workspaceRoot}"
    }

screen shot 2016-12-07 at 13 16 12

@orta , ты тоже можешь поделиться своим

Это все OSS - https://github.com/artsy/emission 🎉

Мое решение для запуска и отладки одного теста Jest в IntelliJ Idea.

Версия узла: v6.9.4

single jest runner

Затем просто запустите любой модульный тест. crtl / command + shift + F10 / F9

debugger

Для тех, кто ищет разъяснений, я смог использовать операторы отладчика в моем коде и тестовых файлах в Node 7.4.0, Jest 18.x и использовать пакет @develar jest-environment-node-debug (из этого комментария ) с этим команда:

node --debug-brk --inspect ./node_modules/.bin/jest -i --env jest-environment-node-debug

@trxcllnt пробовал это, к сожалению, у меня не работает :(

Я также собирался упомянуть https://github.com/nodejs/node/issues/6283, но я вижу, что @cpojer уже участвует в этом :)

Только что вышел Node.js 7.5.0, который уже исправляет некоторые связанные проблемы (исправил это для меня)

Спасибо за работу над @trxcllnt , без инспектора исходных карт отладка на удивление болезненна с node.

@iammerrick @trodrigues @trxcllnt @snapwich Попробуйте этот модуль npm jest-environment-node-debug

Я внес некоторые изменения, которые исправили отладку узлов для меня с использованием Node v7 и Jest 18.

Также я использую его, добавляя "testEnvironment": "jest-environment-node-debug" в мою конфигурацию Jest.

К вашему сведению, я использовал devtool для отладки

РЕДАКТИРОВАТЬ: извините, я был слишком рано, я все еще вижу некоторые проблемы (пытаюсь их исправить)
EDIT2: неважно, я пытался использовать ту же среду для локального запуска моих тестов, что не удалось, потому что ей нужна среда отладки узла
EDIT3: Спасибо @develar за разрешение на публикацию в качестве исходного модуля

Когда я использую jest-environment-node-debug, эмуляция документа jsdom, похоже, не работает. Есть ли способ это изменить?

Между этой проблемой и https://github.com/facebook/jest/issues/2801, из-за которой даже обычно безотказная отладка в стиле printf в некоторых случаях выходит непонятно, я нахожу отладку чрезвычайно сложной.

@AgentME Что вы имеете в виду под "не на

@NikhilVerma Глобальные переменные document, window и другие глобальные переменные браузера не присутствуют при использовании jest-environment-node-debug.

test('foo', () => {
  document.body.textContent = '123';
});

@AgentME Я думаю, что это ожидаемое последствие, поскольку jest-environment-node-debug основан на jest-environment-node а не на jest-environment-jsdom , среде по умолчанию, которая предоставляет document и другие глобальные объекты для имитации среда браузера.

Бродят о том же, что и @AgentME.

К вашему сведению

Привет. только что увидел новую версию узла https://nodejs.org/en/blog/release/v7.6.0/
Не уверен, что этот выпуск улучшит что-либо, поскольку в нем упоминается несколько изменений

lib: build node inspect into node (Anna Henningsen) #10187
inspector: add --inspect-brk (Josh Gavant) #11149

@ bsr203 Я только что тестировал на узле v7.6.0 и точки останова, а операторы debugger; в тестах все еще не работают

@DanielHoffmann @ bsr203 @AgentME Не могли бы вы клонировать https://github.com/NikhilVerma/jest-environment-node-debug-fixed и запустить npm run devtool и сообщить мне, сработает ли ваша точка останова, и вы можете увидеть документ .body.textContent (потому что я могу).

Вам нужен NodeJS 7.5.0 или выше

@NikhilVerma - нет, но у document.body.textContent есть только один разрыв строки
Я не знаю, правильно ли я использую его, я установил devtool глобально, а затем установил jest-environment-node-debug-fixed из реестра npm в качестве зависимости dev в моем проекте, затем я запустил:

devtool ./node_modules/.bin/jest --colors --config=myConfig

Тесты выполняются, но точки останова не работают. В отличие от node --inspect я даже не могу открыть тестовые файлы в отладчике

@DanielHoffmann Ты ошибся :)

git clone [email protected]:NikhilVerma/jest-environment-node-debug-fixed.git
cd jest-environment-node-debug-fixed
npm install
npm run devtool

В основном реквизиты

  • Node v7.5.0 как минимум
  • Jest 17+
  • Devtool установлен
  • Jest CLI запускался с параметром "-i"
  • пакет jest-environment-node-debug (1.0, если у вас jest17 и 2.0, если у вас jest18)
  • Сделайте клон своей конфигурации jest и добавьте "testEnvironment": "jest-environment-node-debug" и используйте эту конфигурацию для запуска jest (чтобы ваши обычные тесты не сломались)

Спасибо за шаги @NikhilVerma. Я сам еще не пробовал это сделать, но я подумал, что упомянул, что надеюсь, что это первое место в списке вещей, над которыми должна работать команда Jest. Я полагаю, что пользователям Jest (в том числе в Facebook) очень хотелось бы получить лучший опыт отладки :) Учитывая, насколько просто все остальное с Jest, это нехарактерно сложно (и я должен сказать ... болезненно 🙀 😉).

У меня есть инструмент node --inspect-brk ./node_modules/.bin/jest --runInBand --env jest-environment-node-debug .

Я все еще получаю ReferenceError: window is not defined даже после использования jest-environment-node-debug-fixed . 😢

Изменить: Однако я заставил его работать с помощью bugger https://github.com/buggerjs/bugger

@sugatmahanti У вас была возможность попробовать шаги, которые я здесь упомянул? https://github.com/facebook/jest/issues/1652#issuecomment -281985580

@NikhilVerma Спасибо, я сделал, но как только я запустил команду, она ничего не сделала. Он открывает отладчик и немедленно закрывает его без каких-либо сообщений.

Используя следующую команду:
$ node --inspect --debug-brk ./node_modules/.bin/jest --runInBand -i --env jest-environment-node-debug

Я получаю следующие ошибки:
ReferenceError: window is not defined
only one instance of babel-polyfill is allowed

также debugger похоже, полностью игнорируется при запуске $ node --inspect --debug-brk ./node_modules/.bin/jest --runInBand

узел 7.6.0
Шутка 19.0.2
babel-jest 19.0.0

Над этим вопросом все еще работают?

Похоже, что jest должен поддерживать команды node v6 + --inspect и --inspect-brk. Надеюсь, скоро это станет шуткой, поскольку, похоже, многие люди изо всех сил пытаются отладить свои модульные тесты (в том числе и я).

Это не шутка. Это ошибка в v8 / node, см. Https://github.com/nodejs/node/issues/7593 - пожалуйста, выразите там свои опасения и попросите команды node или v8 исправить это в vm / contextxtify.

Я собираюсь закрыть этот вопрос, потому что он не требует действий с нашей стороны. Выше были описаны некоторые обходные пути, которые могут или не сработать для вас. Как только это будет исправлено в node / v8, в конечном итоге оно автоматически начнет работать.

Установив jest-environment-node-debug , я смог создать рабочую конфигурацию launch.json для vscode, используя протокол инспектора с узлом 8.

Если кому-то интересно, это минимальная необходимая конфигурация (при условии, что порт и адрес стандартные):

{
  "name": "Debug Jest",
  "type": "node",
  "request": "launch",
  "runtimeArgs": [
    "--inspect-brk",
    "./node_modules/.bin/jest",
    "-i",
    "--env",
    "jest-environment-node-debug"
  ],
  "cwd": "${workspaceRoot}",
  "protocol": "inspector",
  "console": "integratedTerminal"
}

на окнах

        {
            "name": "Debug Jest",
            "type": "node",
            "request": "launch",
            "runtimeArgs": [
                "--inspect-brk",
                "./node_modules/jest/bin/jest.js",
                "-i",
                "--env",
                "jest-environment-node-debug"
            ],
            "cwd": "${workspaceRoot}",
            "protocol": "inspector",
            "console": "integratedTerminal",
            "sourceMaps": true
        }

К вашему сведению, эта проблема должна быть решена в Node 8.4.0 (https://github.com/nodejs/node/pull/14465).

Это замечательно. В заключение! :)

Спасибо всем, у кого это получилось 👏

Итак, есть ли что-то конкретное, что нужно сделать, помимо установки последней версии node v8.4.0? Может ли кто-нибудь опубликовать для этого свой vscode launch.json ?

Эта конфигурация запуска vscode работает для меня :)

    {
      "name": "Debug Jest tests",
      "type": "node",
      "request": "launch",
      "runtimeArgs": [
        "--inspect",
        "./node_modules/.bin/jest",
        "-i"
      ],
      "cwd": "${workspaceRoot}",
      "protocol": "inspector",
      "console": "integratedTerminal"
    }

Вам просто нужно запустить его «по-новому». То есть с inspect , --inspect или --inspect-brk . См. Https://nodejs.org/en/docs/inspector/ для получения дополнительной информации о различных способах его запуска и возможностях подключения к нему.

Вышеупомянутые jest-environment-node-debug не нужны.

node --inspect --inspect-brk node_modules/bin/jest должен работать с узлом 8.4.0 из коробки. Я так счастлив, что это наконец-то сработало, это была одна из основных проблем, из-за которой было трудно отлаживать тесты JavaScript.

Для тех, кто использует create-react-app / react-scripts :

./node_modules/.bin/react-scripts --inspect-brk test --env=jsdom --runInBand

Убедитесь, что вы на react-scripts@^1.011 !

Точки останова не подходят для меня.

  • Windows 10
  • Узел 8.4
  • VSCode 1.15.1
  • Шутка 20

См. Пример проекта здесь:
https://github.com/sparebytes/jest-debug-example

Это конфигурация запуска:

{
    "name": "Debug Jest tests",
    "type": "node",
    "request": "launch",
    "sourceMaps": true,
    "runtimeArgs": [
        "--inspect-brk",
        "--nolazy",
        "./node_modules/jest/bin/jest.js",
        "-i"
    ],
    "cwd": "${workspaceRoot}",
    "protocol": "inspector",
    "console": "integratedTerminal"
}

@sparebytes в консоли, проверьте свой узел --version, убедитесь, что это 8.4. Следующая конфигурация запуска сработала для меня с теми же характеристиками:

  {
    "name": "Debug Jest tests",
    "type": "node",
    "request": "launch",
    "program": "${workspaceRoot}\\node_modules\\jest\\bin\\jest.js",
    "args": [
      "--runInBand",
      "--no-cache"
    ],
    "runtimeArgs": [
      "--inspect-brk"
    ],
    "cwd": "${workspaceRoot}",
    "protocol": "inspector",
    "console": "integratedTerminal"
  }

У меня все еще не работает на 8.4.0, и я все перепробовал.

Похоже, что точки останова становятся красными (активируются) после завершения тестов. Есть идеи?

+1
У меня тоже не работает

@yevhenchmykhunep Вы

./node_modules/.bin/react-scripts --inspect-brk test --env=jsdom --runInBand

Автор @Timer

У меня проблема на узле v10.5.0 и [email protected] node --inspect --inspect-brk ./node_modules/jest/bin/jest.js

Разрыв в первой строке работает, но вызовы debugger не прекращаются :(

Похоже, это не проблема шутки, а проблема nodejs. У меня такая же проблема с отладкой моего приложения. Я использую узел v8.11.3

Я могу заставить отладчик порождаться и нажимать строки отладчика в узле 8.

"test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand -t",

и

nvm exec 8 yarn test:debug

Однако эта строка отладчика не вызовет остановки:

describe.skip('With Enzyme', () => {
  it('ArticleSidebar component displays', () => {
    debugger;

Эта строка будет:

// this code is in not in tests
import { config } from './nextConfig';
let log, logError;
debugger; 

Таким образом, для меня мораль этой истории такова: не ждите, что будут обнаружены прерывания отладчика, если они находятся в тестовом коде Jest. Почему? Может, кто-то умнее меня захочет разобраться в этом 😸

Для тех, кто все еще сталкивается с этой проблемой, отладка в Chrome DevTools работает с оператором отладчика. Не идеальное решение, но достойный обходной путь:

Для отладки в Google Chrome (или в любом браузере на основе Chromium) просто откройте свой браузер, перейдите на страницу chrome: // inspect и нажмите «Открыть выделенные инструменты разработки для узла», чтобы получить список доступных экземпляров узлов, которые вы можете подключить. к. Просто щелкните адрес, отображаемый в терминале (обычно что-то вроде localhost: 9229) после выполнения указанной выше команды, и вы сможете отлаживать Jest с помощью DevTools Chrome.

Отобразятся инструменты разработчика Chrome, и точка останова будет установлена ​​в первой строке сценария Jest CLI (это делается просто для того, чтобы дать вам время открыть инструменты разработчика и предотвратить выполнение Jest до того, как у вас будет время для этого. ). Нажмите кнопку, которая выглядит как кнопка «воспроизведение» в верхнем правом углу экрана, чтобы продолжить выполнение. Когда Jest выполняет тест, содержащий оператор отладчика, выполнение приостанавливается, и вы можете проверить текущую область видимости и стек вызовов.

Источник: https://jestjs.io/docs/en/troubleshooting#tests -are-failing-and-you-don-t-know-why

@jchani, даже с этим методом, операторы отладки внутри тестов все равно не сломаются. Как отметил @jcollum . Даже с включенным разрывом в первой строке. Точки останова внутри тестов - это тот тип, который мы все хотим больше, чем любой другой. Отладка, почему перестал работать тест, без этой возможности - лаваш.

https://github.com/vuematerial/vue-material/pull/1840 @ Samuell1, почему вы хотите придерживаться jest 22, когда у нас 4 теста не работают на dev ... imo, при неудачных тестах никогда нельзя допускать фиксации.

Для пользователей Vue: если ваши операторы отладчика не работают ... попробуйте переместить их в свой компонент вместо кода шутки, сделайте как можно меньше шутки и просто проверьте состояние ваших фикстур ... по крайней мере, до тех пор, пока nodejs команда исправляет эту проблему.

Мои вызовы debugger находятся в input-speed.vue . Я понимаю, что это не идеально, но это лучше, чем отсутствие отладки или отказ от тестов, потому что их слишком сложно построить.

import Vue from 'vue'
import { mount } from 'avoriaz'
import f1 from '../fixtures/input-speed.vue'

test('should work with phones autocorrect', async () => {
  const wrapper = await mount(f1, {})
  const vm = wrapper.vm

  await wrapper.vm.$nextTick()

  // should work with android autocorrect without waiting
  expect(vm.form.server).toBe('autocorrect')
  expect(vm.noBind).toBe('Not data binded')  // Should work without data binding
})

Добавление этого для всех, у кого возникла эта проблема при использовании параметра --watch - операторы debugger игнорируются с помощью --watch , однако добавление --no-cache устраняет проблему. Я могу подтвердить, что на узле 10.8.0 последовательно работает следующее:

node --inspect-brk node_modules/.bin/jest --runInBand --no-cache --watch

для узла 6.x вместо node --inspect-brk попробуйте node inspect (обратите внимание на отсутствие дефисов)

nvm

Мне помогло это расширение: https://chrome.google.com/webstore/detail/nodejs-v8-inspector-manag/gnhhdgbaldcilmgcpfddgdbkhjohddkj/related?hl=en

Он обнаруживает node --inspect и открывает devTools в Chrome для этого веб-сокета. debugger операторы и точки останова, установленные вручную в инструментах разработки, сработали!

Забавно, похоже, мне здесь повезет больше, если я выключу Node Inspector Manager и вместо этого использую chrome://inspect .

@jcollum Как разработчик NiM ... что-нибудь, в частности, я должен знать?

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

Я хотел сообщить, что мы столкнулись с той же проблемой, о которой упоминал @ brien-givens

Как он сказал, добавление --no-cache решает проблему для нас (подробности см. Здесь: https://github.com/facebook/jest/issues/1652#issuecomment-412692363)

@ brien-givens спасибо, что поделились своим решением :-)

Для меня проблема заключалась в двух файлах * .test.js с одинаковым именем (расположенных в разных папках). Когда я удалил один из них, отладчик без проблем попал в другой.
Конфигурация:
"name": "Debug Jest Test", "type": "node", "request": "launch", "program": "${workspaceRoot}/node_modules/jest/bin/jest", "args": [ "${fileBasenameNoExtension}", ], "console": "integratedTerminal"

Была ли эта страница полезной?
0 / 5 - 0 рейтинги