如何在VSCode中通过rake test调试非Rails Ruby应用的minitest用例
问题根因
当前配置仅将调试器挂载到了rake主进程,绝大多数Ruby项目的test Rake任务都会fork独立子进程执行测试用例,rdebug-ide默认不会自动附加到派生的子进程,因此只有Rakefile内的断点可以命中,子进程中加载的测试文件、应用代码断点都不会触发。
修复方案
推荐优先使用第一种方案,绕开rake进程fork逻辑,配置更稳定。
方案1:直接启动Minitest,不通过Rake调用
直接指定Minitest作为启动程序,完全绕开rake的进程fork逻辑,配置如下:
{ "name": "Debug Minitest", "type": "Ruby", "request": "launch", "useBundler": true, "cwd": "${workspaceRoot}", "showDebuggerOutput": true, "pathToBundler": "/home/user/.rbenv/versions/2.5.5/bin/bundle", "pathToRDebugIDE": "/home/user/.rbenv/versions/2.5.5/bin/rdebug-ide", // 直接用ruby执行测试文件 "program": "${workspaceRoot}/test_file.rb", "args": [ "--name", "test_name" ], "env": { "LOG_LEVEL": "debug" } }
如果你的测试需要通过bundler加载依赖,也可以将program改为bundle路径,args补充为["exec", "minitest", "test_file.rb", "--name", "test_name"]。
方案2:保留Rake调用,开启子进程跟踪
如果必须使用Rake任务执行测试,给rdebug-ide添加--follow-fork参数,让调试器自动附加到fork出来的子进程:
{ "name": "Debug a rake task", "type": "Ruby", "request": "launch", "useBundler": true, "cwd": "${workspaceRoot}", "showDebuggerOutput": true, "pathToBundler": "/home/user/.rbenv/versions/2.5.5/bin/bundle", "pathToRDebugIDE": "/home/user/.rbenv/versions/2.5.5/bin/rdebug-ide", // 新增参数,开启fork子进程跟踪 "additionalRubyArgs": [ "--debugger-follow-fork" ], "program": "/home/user/.rbenv/versions/2.5.5/bin/rake", "args": [ "test" ], "env": { "LOG_LEVEL": "debug", "TEST": "test_file.rb", "TESTOPTS": "--name=test_name" } }
额外排查点
- 确认测试文件的路径配置正确,vscode工作区根目录和项目实际根目录一致,避免路径映射不匹配导致断点无法识别
- 确认
ruby-debug-ide和debasegem版本和Ruby 2.5.5兼容,推荐使用ruby-debug-ide ~> 0.7.0、debase ~> 0.2.4版本
内容的提问来源于stack exchange,提问作者Halil Sen
相关产品推荐
相关产品推荐

