ruby-lsp-rspec icon indicating copy to clipboard operation
ruby-lsp-rspec copied to clipboard

undefined method 'sub' for nil:NilClass (NoMethodError)

Open dnalbach opened this issue 4 weeks ago • 0 comments

Ubuntu 24.04

VS Code 1.105.1

ruby 3.2.8

Gemfile.lock:

ruby-lsp (0.26.2)
  language_server-protocol (~> 3.17.0)
  prism (>= 1.2, < 2.0)
  rbs (>= 3, < 5)
ruby-lsp-rspec (0.1.28)
  ruby-lsp (~> 0.26.0)

The below error output came after my test output.

<5 more of these above>

  6) XYZ::RequisitionGateway#fetch returns a successful response with the parsed document
     Failure/Error: parts[0].sub(/^\./, "file://" + File.expand_path(".")) + ":" + parts[1] + " : " + (parts[2] || "")
     
     NoMethodError:
       undefined method `sub' for nil:NilClass

Randomized with seed 60755

/home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:83:in `adjust_backtrace': undefined method `sub' for nil:NilClass (NoMethodError)

        parts[0].sub(/^\./, "file://" + File.expand_path(".")) + ":" + parts[1] + " : " + (parts[2] || "")
                ^^^^
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:50:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:50:in `example_failed'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:209:in `block in notify'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:208:in `each'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:208:in `notify'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:145:in `example_failed'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example.rb:484:in `finish'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example.rb:442:in `fail_with_exception'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:614:in `block in run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:656:in `each'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:656:in `for_filtered_examples'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:660:in `block in for_filtered_examples'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:658:in `each'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:658:in `for_filtered_examples'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:614:in `rescue in run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:610:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/configuration.rb:2091:in `with_suite_hooks'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:116:in `block in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:74:in `report'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:115:in `run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:89:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:71:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:45:in `invoke'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/exe/rspec:4:in `<top (required)>'
        from bin/rspec:29:in `load'
        from bin/rspec:29:in `<main>'
/home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:83:in `adjust_backtrace': undefined method `sub' for nil:NilClass (NoMethodError)

        parts[0].sub(/^\./, "file://" + File.expand_path(".")) + ":" + parts[1] + " : " + (parts[2] || "")
                ^^^^
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:50:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:50:in `example_failed'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:209:in `block in notify'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:208:in `each'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:208:in `notify'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:145:in `example_failed'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example.rb:484:in `finish'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example.rb:442:in `fail_with_exception'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:614:in `block in run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:656:in `each'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:656:in `for_filtered_examples'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:614:in `rescue in run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:610:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:608:in `block in run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:608:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:608:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/configuration.rb:2091:in `with_suite_hooks'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:116:in `block in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:74:in `report'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:115:in `run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:89:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:71:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:45:in `invoke'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/exe/rspec:4:in `<top (required)>'
        from bin/rspec:29:in `load'
        from bin/rspec:29:in `<main>'
/home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:83:in `+': no implicit conversion of nil into String (TypeError)

        parts[0].sub(/^\./, "file://" + File.expand_path(".")) + ":" + parts[1] + " : " + (parts[2] || "")
                                                                       ^^^^^^^^
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:83:in `adjust_backtrace'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:50:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/ruby-lsp-rspec-0.1.28/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb:50:in `example_failed'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:209:in `block in notify'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:208:in `each'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:208:in `notify'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:145:in `example_failed'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example.rb:484:in `finish'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example.rb:293:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:646:in `block in run_examples'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:642:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:642:in `run_examples'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:607:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:608:in `block in run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:608:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/example_group.rb:608:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `map'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/configuration.rb:2091:in `with_suite_hooks'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:116:in `block in run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/reporter.rb:74:in `report'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:115:in `run_specs'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:89:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:71:in `run'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/lib/rspec/core/runner.rb:45:in `invoke'
        from /home/myapppath/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.13.0/exe/rspec:4:in `<top (required)>'
        from bin/rspec:29:in `load'
        from bin/rspec:29:in `<main>'

I have failing tests right now due to a tenant schema issue where a table is not being found in the public schema, which is the wrong schema to look in. That issue has nothing to do with LSP, but that issue has caused a problem for the formatter as seen above, and it is causing an error that it shouldn't. The case of nil should be handled without an exception.

If I run bin/rspec in a terminal, the failing tests give this error without separate exceptions:

     ActiveRecord::StatementInvalid:
       PG::UndefinedTable: ERROR:  relation "optum_lab_orders" does not exist
       LINE 1: UPDATE "optum_lab_orders" SET "optum_lab_order_id" = $1 WHER...
                      ^

So that's the real error that the rspec_formatter should be surfacing in the test failures without a backtrace, and that's what running rspec directly shows. My desired outcome is that the formatter output match rspec's output.

You might be able to reproduce the issue by running a migration for a table, creating the model, writing tests for that model, and then manually deleting that table from the database. That might produce similar behavior. I have not tried to reproduce the situation artificially.

dnalbach avatar Nov 07 '25 01:11 dnalbach