blu*_*e13 8 javascript reactjs jestjs babeljs babel-jest
当我在包含错误的存储库中运行玩笑测试时,堆栈跟踪指向错误的行号。这使得调试非常困难。例如:
\n \xe2\x97\x8f SimpleComponent \xe2\x80\xba renders\n\n ReferenceError: retur is not defined\n\n 4 | export const Simple = () => {\n 5 | const [count, setCount] = useState(0);\n > 6 | retur (\n | ^\n 7 | <div>\n 8 | <p>You clicked {count} times</p>\n 9 | <button onClick={() => setCount(count + 1)}>Click me</button>\n\n at Simple (src/SimpleComponent.jsx:6:3)\n at Object.<anonymous> (tst/SimpleComponentTest.jsx:8:5)\nRun Code Online (Sandbox Code Playgroud)\n请注意,它指向错误的行号 - 34 而不是 6。
\n \xe2\x97\x8f SimpleComponent \xe2\x80\xba renders\n\n ReferenceError: retur is not defined\n\n\n\n at Simple (src/SimpleComponent.jsx:34:3)\n at Object.<anonymous> (tst/SimpleComponentTest.jsx:14:23)\nRun Code Online (Sandbox Code Playgroud)\n我发现如果我注释掉中的moduleDirectoriesjest.config.js条目,那么我会收到预期的错误消息。我不明白为什么moduleDirectories会有这样的影响。
不过,我想保留我的moduleDirectories.
为什么笑话测试的堆栈跟踪指向错误的行号?我该如何修复它?
\n我在https://github.com/bluprince13/jest-wrong-line-numbers-in-stack-trace中上传了一个最小的示例
\n来源
\n请注意,该return语句拼写错误。
// src/SimpleComponent.jsx\nimport React, {useState} from "react"\n\nexport const Simple = () => {\n const [count, setCount] = useState(0);\n retur (\n <div>\n <p>You clicked {count} times</p>\n <button onClick={() => setCount(count + 1)}>Click me</button>\n </div>\n );\n};\nRun Code Online (Sandbox Code Playgroud)\n测试
\n// tst/SimpleComponentTest.jsx\nimport { Simple } from "../src/SimpleComponent";\nimport { render } from "@testing-library/react";\nimport React from "react";\n\ndescribe("SimpleComponent", () => {\n it("renders", () => {\n render(<Simple />);\n });\n});\nRun Code Online (Sandbox Code Playgroud)\n.babelrc
\n{\n "presets": [\n "@babel/preset-react",\n [\n "@babel/preset-env"\n ]\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n笑话配置.js
\nmodule.exports = {\n moduleDirectories: [\n "<rootDir>/src",\n "<rootDir>/tst",\n "<rootDir>/node_modules"\n ],\n testMatch: ["**/tst/**/(*)Test.js?(x)", "**/?(*.)(spec|test).js?(x)"],\n transform: {\n "^.+\\\\.jsx?$": "babel-jest"\n }\n};\nRun Code Online (Sandbox Code Playgroud)\n包.json
\n{\n "scripts": {\n "test": "jest --runInBand"\n },\n "dependencies": {\n "react": "^16.14.0",\n "react-dom": "^16.14.0",\n "snapshot-diff": "^0.6.2"\n },\n "devDependencies": {\n "babel-jest": "^25.2.4",\n "@babel/preset-env": "7.x",\n "@babel/preset-react": "7.x",\n "@testing-library/react": "^9.2.0",\n "jest": "^26.6.3"\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
为什么笑话测试的堆栈跟踪指向错误的行号?我该如何修复它?
它与源映射有关。如果这些没有正确生成或处理,调试器将显示错误的行。
我发现了三种方法来解决这个问题:
更改<rootDir>/node_modules为node_modules您的
moduleDirectories
为什么这可以解决问题?
<rootDir>添加了,则开玩笑或更准确地说其底层模块source-map-support使用source_map来自 的模块node_modules/source-map。在我的例子中,全新安装的示例是0.7.3. 但source_map_support依赖的是^0.6.0. 它实际上带来了正确的版本node_modules/source-map-support/source-map。但由于指定的某种原因<rootDir>,它无法再访问它。这就引出了第二个解决方案。通过手动将source-map模块降级^0.6.0为项目的依赖项。在这种情况下,node_modules/source-map将再次提供正确的版本,但这可能会破坏其他内容,因为尚不清楚这个错误版本的来源。