4

Despite having spent about the last three hours trying to get this working I cannot for the life of my get RSpec to work with the debugger on VSCode. I can get Rspec to run in the terminal on VSCode but that doesn't give me any of the IDE's debugging functionality for inspecting and stepping.

This is what I've got in my launch.json file:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Run RSpec - all",
            "type": "Ruby",
            "request": "launch",
            "cwd": "${workspaceRoot}",
            "program": "/Users/my-home-dir/.rvm/gems/ruby-2.6.5@project-gemset-name/wrappers/rspec",
            "pathToRDebugIDE": "/Users/my-home-dir/.rvm/gems/ruby-2.6.5@project-gemset-name/gems/ruby-debug-ide-0.7.2",
            "args": [
                "--pattern",
                "${workspaceRoot}/spec/**/*_rspec.rb"
            ]
        }
    ]
}

And my gemfile contains:

  gem 'ruby-debug-ide', '~>0.7.2'
  gem 'debase', '~>0.2.4.1'

I've got a feeling that the errors may be coming about due to in incompatibility between RVM and VSCode but I've no idea how to unwind that issue.

This was all setup as per the Microsoft recipe here: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-Ruby-on-Rails

Every time I run this setup I get the following error in the debug console:

Debugger terminal error: Process failed: spawn rdebug-ide ENOENT

Is there any way to get this to run? Also is there any way to get it to use guard so that it runs automatically?

Peter Nixey
  • 16,187
  • 14
  • 79
  • 133

3 Answers3

3

I got it working. Unfortunately, I don't use RVM. So, my solution involves rbenv. I'm sharing it here anyway in case it helps you, or someone else.

which rspec pointed me to the shim (shell script) that rbenv uses to execute the version of rspec installed under the current version of Ruby. When I configured launch.json with that path rdebug-ide didn't like the shim. I assume it was expecting the executable.

So, I ran rbenv which rspec and got the actual path to the executable. Once I plugged that into launch.json it worked fine. Of course, if I change the version of Ruby I'm running, I'll have to update the file to point to the version of RSpec installed under the new version of Ruby.

Given the prevalence of Ruby version managers among the community, I would think ruby-debug-ide would have considered this. Perhaps it's worth an issue on their GitHub: https://github.com/ruby-debug/ruby-debug-ide.

aridlehoover
  • 3,139
  • 1
  • 26
  • 24
1

I added a preLaunchTask to launch rdebug-ide server then looked for a pattern before attaching the debugger.

I used the focus flag for controlling which tests are run or not. Am able to set breakpoints in main script files as well as *_spec.rb files.

Gemfile:

group :test, :development do
  gem "ruby-debug-ide", "~> 0.7.2"
  gem "debase", "~> 0.2.4"
end

launch.json:

{     
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for rdebug-ide rspec",
            "type": "Ruby",
            "request": "attach",
            "remoteHost": "127.0.0.1",
            "remotePort": "1234",
            "preLaunchTask": "run-rdebug-for-rspec",
            "remoteWorkspaceRoot": "${workspaceRoot}",
            "cwd": "${workspaceFolder}"
        }
    ]
}

tasks.json

{
    "version": "2.0.0",
    "tasks": [{
        "label": "run-rdebug-for-rspec",
        "command": "bundle",
        // could update these are you see fit 
        // my tests were located in /spec folder
        "args": [
          "exec","rdebug-ide",
          "--host","0.0.0.0",
          "--port","1234",
          "--dispatcher-port","26162",
          // needed to specify the full path of bundle
          // can be found by `which bundle`
          "--", "/usr/local/bin/bundle", "exec", "rspec", "spec/"
        ],
        "type": "shell",
        "isBackground": true,
        // this will look for a pattern to attach to rdebug server
        // attaching to the server will start running the tests
        "problemMatcher": [
            {
              "pattern": [
                {
                  "regexp": ".",
                  "file": 1,
                  "location": 2,
                  "message": 3
                }
              ],
              "background": {
                "activeOnStart": true,
                // once server is up and running it'll display something like:
                // Fast Debugger (ruby-debug-ide 0.7.2, debase 0.2.4.1, file filtering is supported) listens on 0.0.0.0:1234
                "beginsPattern": "^Fast Debugger.*1234$",
                "endsPattern": ".",
              }
            }
          ],
        // open up a new task window everytime
        // if set to default `shared` then previous task window needs to be closed 
        // otherwise, was having issues getting patternMatcher to work
        // and for rdebug to attach within a shared terminal on successive runs, or restarts. 
        "presentation": {
          "panel": "new"
        }
    }]
}
Elliott de Launay
  • 1,027
  • 13
  • 31
0

While the answer above may work, there will be problems as soon as you upgrade your ruby version because the paths are hard coded.

Here is a less brittle approach that should be able to survive a version upgrade without any problem.

I'm on ruby 3.0.3, managed by rvm on mac osx.

Gemfile includes:

group :development do 
  gem 'ruby-debug-ide'
  gem 'debase', "~> 0.2.5.beta2"
end

(the stable version of debase didn't support ruby v3, hence the beta)

Launch config use the GEM_HOME environment variable to specify the rspec binary (vscode default configuration puts this in workspace root for some reason):

   {
        "name": "RSpec - all",
        "type": "Ruby",
        "request": "launch",
        "program": "${env:GEM_HOME}/bin/rspec",
        "args": [
            "-I",
            "${workspaceRoot}"
        ]
    }
Rene Wooller
  • 1,107
  • 13
  • 22