有没有办法使用节点检查器来使用Jest调试单元测试?有时可以逐步查看测试失败的原因
我尝试了几种方法
node-debug jest --runInBand
以及首先启动检查员,例如
$ node-inspector
$ node --debug-brk .\node_modules\jest-cli --runInBand
然后导航到http://127.0.0.1:8080/debug?port=5858
我偶尔发现(10次左右),调试器会打开jest src文件并调试它们。但一般来说,调试器中的脚本只包含“无域”文件夹和另一个不相关的文件夹。 此外,测试脚本本身永远不会在调试器中加载。
以前有人试过吗?
答案 0 :(得分:15)
问题似乎是jest
正在使用harmonize
,它会生成子进程以确保使用--harmony
选项。
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用来产生协调过程的代码来成功调试jest测试(尽管tests that use JSX transforms are incredibly slow)。
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
,以便测试按顺序运行,而不是并行运行。
这将打开Web调试器,您可以调试测试,尽管进入您想要的测试可能会非常慢。如果有人知道如何加快速度,请发表评论,我会更新我的答案。
您可以将其添加到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
答案 1 :(得分:13)
现在官方支持,节点&gt; = 6.3。
引用Jest documentation:
在任何测试中放置
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_inspector_integration_for_node_js
答案 2 :(得分:4)
这是一个Gruntfile.js配置,用于自动化@ Sean对Grunt的回答。
grunt testd
OR
grunt testd --tests=MyTestName
OR
grunt testd --tests=MyTestName,AnotherTestName
需要“node-inspector”(必须全局安装以获取路径中的节点调试bin),“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']);
};
答案 3 :(得分:4)
使用Node 7.4.0,Jest 18.x和jest-environment-node-debug
包(来自this comment),现在可以使用chrome devtools来调试Jest测试:
$ npm install -D jest-environment-node-debug
$ node --inspect-brk ./node_modules/.bin/jest -i --env jest-environment-node-debug