Отладка тестовых случаев Jest с помощью инспектора узлов

Есть ли способ использовать инспектор узлов для отладки модульных тестов с помощью Jest? Было бы неплохо иногда пройтись, чтобы увидеть, почему тесты не работают.

Я пробовал несколько способов

node-debug jest --runInBand 

из, а также сначала запустив инспектора, например

$ node-inspector
$ node --debug-brk .\node_modules\jest-cli --runInBand

а затем перейдите к http://127.0.0.1:8080/debug?port=5858

Я обнаружил, что иногда (1 раз из 10 или около того) отладчик открывает файлы jest src, и их можно отлаживать. Однако обычно сценарии в отладчике содержат только папку «без домена» и еще одну нерелевантную папку. Также сами тестовые скрипты никогда не загружаются в отладчик.

Кто-нибудь пробовал это раньше?


person Ron    schedule 05.08.2014    source источник


Ответы (4)


Похоже, проблема в том, что jest использует harmonize, который порождает дочерний процесс, чтобы убедиться, что используется опция --harmony.

гармонизировать/harmonize.js, строки 30-35

var node = child_process.spawn(process.argv[0], ['--harmony'].concat(process.argv.slice(1)), {});
node.stdout.pipe(process.stdout);
node.stderr.pipe(process.stderr);
node.on("close", function(code) {
    process.exit(code);
});

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

node_modules/jest-cli/bin/jest.js, последние строки файла:

if (require.main === module) {
  //harmonize();                  <--- comment out
  _main(function (success) {
    process.exit(success ? 0 : 1);
  });
}

Затем вы можете запустить:

$ node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand

Jest полагается на наличие флага --harmony, поэтому нам нужно добавить его обратно с --nodejs --harmony. Мы также добавляем --runInBand, чтобы тесты выполнялись последовательно, а не параллельно.

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

Вы можете добавить это к своему package.json, чтобы было легче начинать:

...
    scripts: {
        "test": "jest",
        "test-debug": "node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand"
    }
...

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

Выпуск Github создан здесь: https://github.com/facebook/jest/issues/152< /а>

person Sean Adkinson    schedule 16.10.2014
comment
Работал отлично для меня! Не требовался monkeypatch и удаление -- runInBand, кажется, позволяет вам пройти тест немного быстрее. Спасибо за подсказку со скриптом. - person Phil Toms; 07.12.2014
comment
Да, мой PR был отклонен из-за строки, на которую вы только что сослались, где он проверяет Proxy, но я не думаю, что это сработало для меня без ручного флага --harmony, но в последнее время я не пробовал снова. Если я смогу убедиться, что он работает без патча для обезьян, я обновлю этот ответ. - person Sean Adkinson; 08.12.2014
comment
Есть ли пошаговые инструкции, чтобы заставить это работать с отладчиком webstorm? - person SuperUberDuper; 24.01.2016

Теперь это официально поддерживается в Node ›= 6.3.
Цитата документация Jest:

Поместите оператор debugger; в любой из ваших тестов, а затем в каталоге вашего проекта запустите:

node --debug-brk --inspect ./node_modules/.bin/jest -i [any other arguments here]

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

Примечание: параметр -i cli гарантирует, что Jest запускает тест в одном и том же процессе, а не создает процессы для отдельных тестов. Обычно Jest распараллеливает тестовые прогоны между процессами, но одновременно отлаживать множество процессов сложно.

Дополнительную информацию об инспекторе V8 можно найти здесь: https://nodejs.org/api/debugger.html#debugger_v8_Observer_integration_for_node_js

person Dan Abramov    schedule 22.09.2016
comment
Это выглядит многообещающе, я пробовал, но это никогда не останавливается на операторе отладчика. Есть идеи? - person hakunin; 01.11.2016
comment
То же самое. Сценарий запускается правильно, и я могу открыть окно браузера и нажать кнопку «Воспроизвести» ... Однако отладчик никогда не срабатывает: | - person Belgor; 21.11.2016
comment
для меня путь шутки другой, поэтому моя команда node --debug-brk --inspect ./node_modules/jest/bin/jest -i --env jest-environment-node-debug - person Nitin Jadhav; 06.03.2017
comment
Я также не вижу остановки шутки над оператором debugger в моей спецификации, используя этот подход. - person dmarr; 20.07.2017
comment
У меня работает, но window не определяется при запуске тестов - person Tim; 26.07.2017
comment
Используйте Node.js V8 --инспекционный менеджер NiM для автоматического подключения вместо копирования URL-адреса в браузер. Также вы можете ввести debugger;, чтобы установить точку останова в коде. Наконец-то мне удалось проверить, что мой запрос axios что-то возвращает. Теперь надо проверить дальше... - person Adrian Moisa; 22.04.2018

Используя Node 7.4.0, Jest 18.x и пакет jest-environment-node-debug (из этого комментарий), теперь можно использовать инструменты разработчика Chrome для отладки тестов Jest:

$ npm install -D jest-environment-node-debug
$ node --inspect-brk ./node_modules/.bin/jest -i --env jest-environment-node-debug
person ptaylor    schedule 29.01.2017
comment
это лучший ответ. все остальные устарели. - person brianyang; 03.08.2017
comment
использование --inspect-brk не запускало тесты (это 'прерывается до запуска пользовательского кода'), но с --inspect получилось - person Bernardo Dal Corno; 03.09.2018

Вот конфигурация Gruntfile.js для автоматизации ответа @Sean с помощью Grunt.

grunt testd

OR

grunt testd --tests=MyTestName

OR

grunt testd --tests=MyTestName,AnotherTestName

Требуется «node-spector» (должен быть установлен глобально, чтобы получить корзину node-debug на вашем пути), «lodash», «jest-cli» и «grunt-shell» узловые модули.

var _ = require('lodash');

var commaSplitToRegex = function(input) {
  return _.map(input.split(','), function(part) {
    return '(' + part + ')';
  }).join('|');
};

var getTestRegex = function(tests) {
  if (tests) {
    return '.*' + commaSplitToRegex(tests) + '.*';
  }

  return '.*';
}

module.exports = function(grunt) {
  grunt.loadNpmTasks('grunt-shell');

  grunt.initConfig({
    shell: {
      jestd: {
        command: function() {
          var testsRegex = getTestRegex(grunt.option('tests'));
          var cmd = 'node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand --config="test_utils/jest.json"';

          if (testsRegex) {
            cmd += ' "' + testsRegex + '"';
          }

          return cmd;
        }
      },
      monkeypatchjest: {
        command: 'sed -i.bak s\\/harmonize\\(\\)\\;\\/\\\\/\\\\/wtf\\/g ./node_modules/jest-cli/bin/jest.js'
      },
      unmonkeypatchjest: {
        command: 'sed -i.bak s\\/\\\\/\\\\/wtf\\/harmonize\\(\\)\\;\\/g ./node_modules/jest-cli/bin/jest.js'
      }
    }
  });

  grunt.registerTask('testd', 'Run tests with debugger.', ['shell:monkeypatchjest', 'shell:jestd']);
};
person limscoder    schedule 06.11.2014