如何在 create-react-app 上调试 jest 单元测试?
how to debug jest unit tests on create-react-app?
我使用 create-react-app 并且我想调试我的单元测试
as Jest documentation says,可以使用此命令进行调试:
node --debug-brk --inspect ./node_modules/.bin/jest -i [any other arguments here]
不幸的是,它不适用于 create-react-app。
我得到了这个错误:
node --debug-brk --inspect ./node_modules/.bin/jest -i
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/remote/serve_file/@60cd6e859b9f557d2312f5bf532f6aec5f284980/inspector.html?experiments=true&v8only=true&ws=localhost:9229/node
Debugger attached.
module.js:457
throw err;
^
Error: Cannot find module '/Users/asafkatz/dev/newmaps/node_modules/.bin/jest'
at Function.Module._resolveFilename (module.js:455:15)
at Function.Module._load (module.js:403:25)
at Timeout.Module.runMain [as _onTimeout] (module.js:590:10)
at tryOnTimeout (timers.js:232:11)
at Timer.listOnTimeout (timers.js:202:5)
Waiting for the debugger to disconnect...
在 create-react-app 上调试 jest 单元测试的正确方法是什么?
create-react-app
将其 node_modules(因此是笑话)放在不同的位置。试试这个:
node --debug-brk --inspect ./node_modules/react-scripts/node_modules/.bin/jest -i
如果这不起作用,只需在项目的文件夹中搜索名为 jest
的文件并更新路径。
运行 jest
以及 Chrome DevTools 似乎有问题(参见 this issue)。
问题:
您可以使用上述命令行(调整jest
路径)使用新的V8 Inspector
协议启动节点调试器:
node --debug-brk --inspect ./node_modules/.bin/jest --runInBand
含义:
# node params
--debug-brk: start debugger, expose external interface, and break at the first line
--inspect: use the new V8 Inspector protocol in the debugger
# jest params
--runInBand: do not fork (make it debuggable)
然后您可以使用 Google Chrome 并连接到给定的 URL 或使用 this useful extension 自动为您完成。
遗憾的是,目前不会考虑测试代码中的 debugger;
调用。
解决方法
要解决此问题,目前,您可以下载与普通 V8
协议兼容的 GUI 调试器,例如 Visual Studio Code。为了使用它,您必须在没有 --inspect
标志的情况下启动节点调试器:
node --debug-brk ./node_modules/.bin/jest --runInBand
然后您可以从 VCS 导航到项目文件夹,进入调试部分,创建标准调试配置,然后 运行 Attach to Process
配置。
如果您使用的是 visual studio 代码,则可以使用以下配置。希望这可以节省几个小时。
我的设置:
- 未弹出的 create-react-app (1.3.1) 项目
- 节点版本:v6.10.3
- Npm 版本:4.6.1
为了让它工作,我还需要使用 npm i --save-dev jest-file jest-css
安装 jest-file and jest-css。这些被用作文件转换器,这样 jest 就不会抱怨文件的导入,例如 svg。
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Test with debugger",
"type": "node",
"request": "launch",
"port": 5858,
"runtimeArgs": [
"--debug-brk",
"--nolazy"
],
"program": "${workspaceRoot}/node_modules/jest/bin/jest.js",
"args": [
"--runInBand",
"--transform={\"^.+\\.(js|jsx)$\": \"babel-jest\",\"^.+\\.css$\": \"jest-css\",\"^(?!.*\\.(js|jsx|css|json)$)\": \"jest-file\"}"
],
"cwd": "${workspaceRoot}"
}
]
}
说明
--nolazy: 完全编译代码以便我们可以正确使用断点
--运行InBand:阻止 Jest 在工作进程中生成测试
--transform: 停止导入svg等文件时出错。如果你把它添加到 package.json,react-scripts 不会让你 运行 npm test
因为它不支持覆盖转换选项。
需要在package.json或.babelrc
中加入以下几行
"babel": {
"sourceMaps": "inline",
"presets": [
"react-app"
]
}
说明
sourceMaps:这必须是 "inline" 或 "both"。如果您不设置此项,当您调试测试时,您将看到转译后的代码而不是您的源代码。
presets:react-app
是 create-react-app 项目的默认预设。如果你不在 package.json 或 .babelrc 中包含它,你会得到错误,因为 jest 不知道如何处理 jsx.
结果
如果您不使用 visual studio 代码,您可以 运行 以下命令并使用另一个 GUI 调试器连接到调试会话:node --debug-brk ./node_modules/jest/bin/jest.js --runInBand --config=./jest-config.json
。只需确保将以下配置放入 jest-config.json
文件中:
"transform": {
"^.+\.(js|jsx)$": "babel-jest",
"^.+\.css$": "jest-css",
"^(?!.*\.(js|jsx|css|json)$)": "jest-file"
}
我也用VSCode,2018年上面的配置对我不起作用。我终于让它工作了,在 launch.json:
中使用这个配置
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"port":9229,
"runtimeExecutable": "${workspaceRoot}/main/node_modules/.bin/react-scripts",
"runtimeArgs": [
"--inspect-brk",
"test"
],
"args": [
"--runInBand",
"--no-cache",
"--env=jsdom"
],
"cwd": "${workspaceRoot}/main",
"protocol": "inspector",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
请注意,我在 workspaceRoot 值之后有 /main,这对您来说可能有所不同,因为我的项目名为 main。这应该是您的项目根目录的位置。
此外,在进入我的测试之前抛出了与我的代码无关的错误。为了解决这个问题,我不得不转到断点下的调试器选项卡,取消选中 "uncaught exceptions" 和 "module.js".
完成这些步骤后,我现在可以调试我的单元测试、在其中设置断点等,但它仍然无法正常工作。例如,它在终端中运行一个额外的命令行,还有其他一些轻微的怪异之处。但它确实工作得很好,足以完成工作。
create react app 文档中有关于如何调试测试的文档。
https://create-react-app.dev/docs/debugging-tests/
总而言之,您只需将此添加到您的 package.json
"scripts": {
"test:debug": "react-scripts --inspect-brk test --runInBand --no-cache"
}
在你的测试中放置一个 debugger;
语句并且 运行
$ npm run test:debug
我使用 create-react-app 并且我想调试我的单元测试
as Jest documentation says,可以使用此命令进行调试:
node --debug-brk --inspect ./node_modules/.bin/jest -i [any other arguments here]
不幸的是,它不适用于 create-react-app。 我得到了这个错误:
node --debug-brk --inspect ./node_modules/.bin/jest -i
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/remote/serve_file/@60cd6e859b9f557d2312f5bf532f6aec5f284980/inspector.html?experiments=true&v8only=true&ws=localhost:9229/node
Debugger attached.
module.js:457
throw err;
^
Error: Cannot find module '/Users/asafkatz/dev/newmaps/node_modules/.bin/jest'
at Function.Module._resolveFilename (module.js:455:15)
at Function.Module._load (module.js:403:25)
at Timeout.Module.runMain [as _onTimeout] (module.js:590:10)
at tryOnTimeout (timers.js:232:11)
at Timer.listOnTimeout (timers.js:202:5)
Waiting for the debugger to disconnect...
在 create-react-app 上调试 jest 单元测试的正确方法是什么?
create-react-app
将其 node_modules(因此是笑话)放在不同的位置。试试这个:
node --debug-brk --inspect ./node_modules/react-scripts/node_modules/.bin/jest -i
如果这不起作用,只需在项目的文件夹中搜索名为 jest
的文件并更新路径。
运行 jest
以及 Chrome DevTools 似乎有问题(参见 this issue)。
问题:
您可以使用上述命令行(调整jest
路径)使用新的V8 Inspector
协议启动节点调试器:
node --debug-brk --inspect ./node_modules/.bin/jest --runInBand
含义:
# node params
--debug-brk: start debugger, expose external interface, and break at the first line
--inspect: use the new V8 Inspector protocol in the debugger
# jest params
--runInBand: do not fork (make it debuggable)
然后您可以使用 Google Chrome 并连接到给定的 URL 或使用 this useful extension 自动为您完成。
遗憾的是,目前不会考虑测试代码中的 debugger;
调用。
解决方法
要解决此问题,目前,您可以下载与普通 V8
协议兼容的 GUI 调试器,例如 Visual Studio Code。为了使用它,您必须在没有 --inspect
标志的情况下启动节点调试器:
node --debug-brk ./node_modules/.bin/jest --runInBand
然后您可以从 VCS 导航到项目文件夹,进入调试部分,创建标准调试配置,然后 运行 Attach to Process
配置。
如果您使用的是 visual studio 代码,则可以使用以下配置。希望这可以节省几个小时。
我的设置:
- 未弹出的 create-react-app (1.3.1) 项目
- 节点版本:v6.10.3
- Npm 版本:4.6.1
为了让它工作,我还需要使用 npm i --save-dev jest-file jest-css
安装 jest-file and jest-css。这些被用作文件转换器,这样 jest 就不会抱怨文件的导入,例如 svg。
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Test with debugger",
"type": "node",
"request": "launch",
"port": 5858,
"runtimeArgs": [
"--debug-brk",
"--nolazy"
],
"program": "${workspaceRoot}/node_modules/jest/bin/jest.js",
"args": [
"--runInBand",
"--transform={\"^.+\\.(js|jsx)$\": \"babel-jest\",\"^.+\\.css$\": \"jest-css\",\"^(?!.*\\.(js|jsx|css|json)$)\": \"jest-file\"}"
],
"cwd": "${workspaceRoot}"
}
]
}
说明
--nolazy: 完全编译代码以便我们可以正确使用断点
--运行InBand:阻止 Jest 在工作进程中生成测试
--transform: 停止导入svg等文件时出错。如果你把它添加到 package.json,react-scripts 不会让你 运行 npm test
因为它不支持覆盖转换选项。
需要在package.json或.babelrc
中加入以下几行"babel": {
"sourceMaps": "inline",
"presets": [
"react-app"
]
}
说明
sourceMaps:这必须是 "inline" 或 "both"。如果您不设置此项,当您调试测试时,您将看到转译后的代码而不是您的源代码。
presets:react-app
是 create-react-app 项目的默认预设。如果你不在 package.json 或 .babelrc 中包含它,你会得到错误,因为 jest 不知道如何处理 jsx.
结果
如果您不使用 visual studio 代码,您可以 运行 以下命令并使用另一个 GUI 调试器连接到调试会话:node --debug-brk ./node_modules/jest/bin/jest.js --runInBand --config=./jest-config.json
。只需确保将以下配置放入 jest-config.json
文件中:
"transform": {
"^.+\.(js|jsx)$": "babel-jest",
"^.+\.css$": "jest-css",
"^(?!.*\.(js|jsx|css|json)$)": "jest-file"
}
我也用VSCode,2018年上面的配置对我不起作用。我终于让它工作了,在 launch.json:
中使用这个配置 {
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"port":9229,
"runtimeExecutable": "${workspaceRoot}/main/node_modules/.bin/react-scripts",
"runtimeArgs": [
"--inspect-brk",
"test"
],
"args": [
"--runInBand",
"--no-cache",
"--env=jsdom"
],
"cwd": "${workspaceRoot}/main",
"protocol": "inspector",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
请注意,我在 workspaceRoot 值之后有 /main,这对您来说可能有所不同,因为我的项目名为 main。这应该是您的项目根目录的位置。
此外,在进入我的测试之前抛出了与我的代码无关的错误。为了解决这个问题,我不得不转到断点下的调试器选项卡,取消选中 "uncaught exceptions" 和 "module.js".
完成这些步骤后,我现在可以调试我的单元测试、在其中设置断点等,但它仍然无法正常工作。例如,它在终端中运行一个额外的命令行,还有其他一些轻微的怪异之处。但它确实工作得很好,足以完成工作。
create react app 文档中有关于如何调试测试的文档。
https://create-react-app.dev/docs/debugging-tests/
总而言之,您只需将此添加到您的 package.json
"scripts": {
"test:debug": "react-scripts --inspect-brk test --runInBand --no-cache"
}
在你的测试中放置一个 debugger;
语句并且 运行
$ npm run test:debug