【问题标题】:Debugger does not stop at production code breakpoints调试器不会在生产代码断点处停止
【发布时间】:2020-08-11 13:05:31
【问题描述】:

我有 nodejs 模块,我通过运行 jasmine-ts --config=spec/support/jasmine.json 对 jasmine-ts [0.3.0] 进行单元测试。

我的意图是我想运行一些单元测试并在我正在测试的函数内部的断点处停止。不幸的是,调试器只在单元测试中停止,而不是在生产代码中。

可能是什么问题?

关于我的尝试的更多信息。

  1. 我的 Intellij IDEA 2020.1 中启用了对更改的 Typescript 重新编译。我可以识别它可以正常工作,因为当我在生产代码中更改一些打字稿文件时,我可以在 dist 文件夹中看到相应 Javascript 文件的更改。
  2. 如果我运行我的模块,那么我也可以在断点处停止。
  3. 奇怪的是,我可以在生产代码中的断点处停止,同时在另一个使用 mocha 的模块中执行单元测试,并像这样运行:npx mocha -r ts-node/register test/**/*.test.ts

想什么可能是错的。

  1. 依赖项可能无法一起正常工作。我最近将库更新到最新版本,但注意到 jasmine-ts 需要 ts-node 小于 8,所以目前我的 package.json 中有以下版本:

    "devDependencies": {
        "jasmine": "3.3.1",
        "jasmine-ts": "^0.3.0",
        "ts-node": "7.0.1",
        "nyc": "^13.0.1",
        "typescript": "^3.8.3",
        "@types/jasmine": "^3.3.8",
        "jasmine-spec-reporter": "^4.2.0",
        "jasmine-reporters": "^2.3.2"
    }
    
  2. 源映射可能已损坏。我检查了一些 *.js.map 文件,似乎它们指向正确的 *.ts 文件,所以,不知道在那里检查什么。

  3. 我在想打字稿配置是否也会影响,但我不清楚具体如何。无论如何,这是我的 tsconfig.json:

    {
    "compilerOptions": {
        "strict": false,
        "target": "es2015",
        "sourceMap": true,
        "module": "commonjs",
        "outDir": "./dist",
        "moduleResolution": "node"
    },
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "./spec/**/*.ts",
        "./node_modules/**/*.ts"
    ]
    }
    
  4. 肯定有问题。当我想查看使用 nyc npm test 运行的覆盖率时,我会看到 Javascript 文件,但是,它应该是 Typescript。但我认为这可能是一个不同的问题,但也许不是......

有解决问题的提示吗?:)

更新:

解决此问题的一种方法是清理 Intellij IDEA 中的代码和其他可能影响稳定工作的文件,方法是从计算机中完全删除项目并再次克隆它。通过这个动作,它帮助我在其他使用 jasmine 的模块中停止了断点,但是当我在某个时候进入生产代码时,我的模块仍然有奇怪的状态,但不是按顺序。我假设看到一些关于承诺的错误,但我没有。

【问题讨论】:

  • 生产代码最小化了吗?你是如何设置断点的?
  • 嗯,我在不同的地方都试过了。我不太明白第二个问题,我正在使用 Intellij IDEA,我单击该行的左侧并得到一个红点。事实是,这些断点在 1-2 周前就已经开始工作了。我现在开始考虑 Intellij IDEA 更新到 2020.1 是否会破坏它,但我仍然对此表示怀疑。
  • 您的生产代码是否针对覆盖率进行了检测?这可能会破坏源映射,从而导致像您这样的问题。如果不是这种情况,请联系支持人员,提供可以重现问题的示例应用程序。它不应该是专有代码,只是具有类似设置的虚拟应用程序
  • 也许我会创建一个虚拟应用程序,看看它的行为是否相似。

标签: node.js typescript unit-testing intellij-idea jasmine


【解决方案1】:

问题是我在 Language & Frameworks -> Typescript 中有 Recompile on changes 复选框on

这带来了为每个.ts 文件生成.js 文件的功能,但在我的情况下,所有js 编译文件必须在dist 目录中,我在tsconfig 文件中指定。我的假设是,在调试会话期间,调试器不知道要获取哪个文件或获取了错误的文件。将 Recompile to changes 设置为 off 解决了这个问题。

尽管由于调试器比预期更早地进入生产代码,我仍然有奇怪的行为,但我认为这是不同的故事,与 Intellij IDEA 偏好无关,而是与定期运行任务的异步代码有关。

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 2021-04-20
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2010-11-25
    • 2011-07-14
    • 2013-09-27
    相关资源
    最近更新 更多