VSCode:如何调试当前的Jest测试文件

时间:2019-09-16 00:40:03

标签: windows visual-studio-code jestjs

如何在当前打开的文件 (仅此一个) 上以调试模式启动jest,而不考虑操作系统(Windows,linux,mac)如何。

问题

在Windows下使用vscode时,无法嘲笑当前(活动)文件,并且仅此一个

此调试配置(来自https://github.com/microsoft/vscode-recipes/tree/master/debugging-jest-tests):

{
      "type": "node",
      "request": "launch",
      "name": "Jest Current File",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": [
        "${fileBasenameNoExtension}",
        "--config",
        "jest.config.js"
      ],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "disableOptimisticBPs": true,
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    }

如果您有多个同名测试(例如index.test.js),将仅运行活动测试

如果我替换

    "args": [
        "${fileBasenameNoExtension}",
        ....
    ]

作者

    "args": [
        "${file}",
        ...
    ]

根本不起作用,因为第一个参数开玩笑地期望它是正则表达式,并且${file}返回文件的绝对路径,在Windows计算机上它将包含{{1 }}反斜杠,反斜杠将被解释为在模式中转义了以下字符。

仔细阅读Jest的文档后,就无法指定单个文件。

VSCode无法将变量转换为正则表达式。

this question中的解决方案尽管几乎相似,但由于使用相同名称的文件而失败(案例1),因此也无法使用。

因此,要么运行了比预期更多的测试,要么根本没有运行任何测试。

我找到了一个涉及单独脚本的解决方案,但任何其他解决方案都将不胜感激。

4 个答案:

答案 0 :(得分:2)

我认为$ {relativeFile}不会起作用,因为它提供了Jest不喜欢的相对路径。

相反,您应该使用$ {fileBasename}

"args": [
   ...,
   "${fileBasename}"
]

答案 1 :(得分:0)

上述问题中提到的解决方案(涉及一个单独的脚本):

调试配置

{
    "type": "node",
    "request": "launch",
    "name": "Jest Current File",
    "program": "${workspaceFolder}/src/utils/betterJestCli.js",
    "args": [
        "${relativeFile}",
    ],
    "console": "integratedTerminal",
    "internalConsoleOptions": "neverOpen",
    "disableOptimisticBPs": true,
    "windows": {
        "program": "${workspaceFolder}/src/utils/betterJestCli.js",
    },
    "cwd": "${workspaceFolder}",
},

betterJestCli.js

const { exec } = require('child_process');

const path = process.argv[2];
const child = exec(
    ['"./node_modules/.bin/jest"', path.replace(/\\/g, '/'), '--config', 'jest.config.js'].join(' '),
    // eslint-disable-next-line prefer-arrow-callback, func-names
    function (error/* , stdout, stderr */) {
        if (error) {
            // eslint-disable-next-line no-console
            console.log(error);
        }
    }
);
// to see Jest's output
child.stderr.pipe(process.stderr);

因此在相对路径上用\替换/可以解决问题,因为从正则表达式的角度来看,/没有任何意义(转义.会很好也有想法)。

最大的问题是我在终端中丢失了Jest的输出颜色。

尚未在其他环境(Linux,Mac)上进行测试,因此我不知道它是否可以跨环境使用。

还有其他想法吗?

答案 2 :(得分:0)

从这里拍摄:https://github.com/Lemoncode/jest-vs-code-debugging-example/blob/master/custom-solution-config-package-json/01-implemented/.vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Jest single run all tests",
      "program": "${workspaceRoot}/node_modules/jest/bin/jest.js",
      "args": [
        "--verbose",
        "-i",
        "--no-cache"
      ],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen"
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Jest watch all tests",
      "program": "${workspaceRoot}/node_modules/jest/bin/jest.js",
      "args": [
        "--verbose",
        "-i",
        "--no-cache",
        "--watchAll"
      ],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen"
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Jest watch current file",
      "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      "args": [
        "${fileBasename}",
        "--verbose",
        "-i",
        "--no-cache",
        "--watchAll"
      ],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen"
    }
  ]
}

答案 3 :(得分:0)

接受的答案提供了运行所有测试、观看所有测试或观看单个文件的启动任务。如果您只想在当前文件中运行测试,那么 --testPathPattern 选项就是您想要的:

{
  "type": "node",
  "request": "launch",
  "name": "Jest debug current file",
  "program": "${workspaceRoot}/node_modules/jest/bin/jest.js",
  "args": ["--verbose", "-i", "--no-cache", "--testPathPattern", "${fileBasename}"],
  "console": "integratedTerminal",
  "internalConsoleOptions": "neverOpen"
}

这确实存在类似名称的文件可能会被错误运行的问题,因为 ${fileBasename} 只是文件名 - 它根本不匹配路径。

仔细想想,这不是一个非常好的答案。我将把它搁置一旁,与其说是有用的东西,不如说是警告。