Отладка тестовых примеров 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" и другую неуместную папку.
Также сами тестовые скрипты никогда не загружаются в отладчик.
Кто-нибудь пробовал это раньше?
Ответы
Ответ 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