Подтвердить что ты не робот

Отладка тестовых примеров Jest с использованием node -инспектора

Есть ли способ использовать node -инспектор для отладки модульных тестов с помощью 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 или около того) отладчик открывает файлы sest sest и его можно отлаживать. В общем случае скрипты в отладчике содержат только папку "no domain" и другую неуместную папку. Также сами тестовые скрипты никогда не загружаются в отладчик.

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

4b9b3361

Ответ 1

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

harmonize/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);
});

Я смог успешно отлаживать тесты jest (хотя тесты, которые используют преобразования 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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

grunt testd

ИЛИ

grunt testd --tests=MyTestName

ИЛИ

grunt testd --tests=MyTestName,AnotherTestName

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

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']);
};

Ответ 4

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

$ npm install -D jest-environment-node-debug
$ node --inspect-brk ./node_modules/.bin/jest -i --env jest-environment-node-debug