spring icon indicating copy to clipboard operation
spring copied to clipboard

spring rspec "uninitialized constant StatsD::Instrument::Matchers" when using statsd-instrument gem

Open russellsilva opened this issue 10 years ago • 5 comments

I'm using the statsd-instrument gem rspec matchers.

$ bundle exec rspec # works fine
$ spring rspec
/Users/rsilva/work/project/spec/spec_helper.rb:149:in `block in <top (required)>': uninitialized constant StatsD::Instrument::Matchers (NameError)
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core.rb:97:in `configure'
        from /Users/rsilva/work/project/spec/spec_helper.rb:98:in `<top (required)>'
        from /Users/rsilva/work/project/spec/controllers/example_spec.rb:1:in `<top (required)>'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1327:in `block in load_spec_files'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1325:in `each'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1325:in `load_spec_files'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:102:in `setup'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:88:in `run'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:73:in `run'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:41:in `invoke'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-core-3.3.2/exe/rspec:4:in `<top (required)>'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/spring-commands-rspec-1.0.4/lib/spring/commands/rspec.rb:18:in `call'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from -e:1:in `<main>'

In spec_helper.rb:

RSpec.configure do |config|
  ...
  config.include StatsD::Instrument::Matchers
end
$ ruby -v
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin14.0]
$ bundle show statsd-instrument
/Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/statsd-instrument-2.0.10
$ bundle show rails
/Users/rsilva/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rails-4.2.4

Incidentally, the Matchers module can't be found from rails console, even without using spring:

$ spring rails console
[1] pry(main)> require 'statsd-instrument'
=> false
[2] pry(main)> StatsD::Instrument::Matchers
NameError: uninitialized constant StatsD::Instrument::Matchers
from (pry):2:in `<main>'

$ bundle exec rails console
[1] pry(main)> require 'statsd-instrument'
=> false
[2] pry(main)> StatsD::Instrument::Matchers
NameError: uninitialized constant StatsD::Instrument::Matchers
from (pry):2:in `<main>'
[3] pry(main)> StatsD::Instrument
=> StatsD::Instrument

I'm really confused as to why it can't see StatsD::Instrument::Matchers. As noted, bundle exec rspec works fine. Any ideas?

russellsilva avatar Nov 06 '15 18:11 russellsilva

We reserve the issue tracker for bugs only, please the Rails talk mailing list or Stack Overflow. Thanks! 😁

kaspth avatar Nov 06 '15 19:11 kaspth

@kaspth I understand, but why is this not considered a bug? There was a similar issue reported earlier that dealt with libraries in the test environment: https://github.com/rails/spring/issues/83

The general problem is the same, there are some constants that seem to stay unloaded when using Spring but everything works fine without Spring.

Any thoughts?

reprah avatar Nov 06 '15 19:11 reprah

Ah, I see. I just saw the external gem and thought that can't be right. Sorry about that :smile:

Do we have a more general issue reported we can pool resources around? It seems like the issues reported focus on the external gems, maybe there's more to gain by focusing on the general issue?

Thanks 😁

kaspth avatar Nov 06 '15 20:11 kaspth

@ryansouza pointed out that the statsd/instrument/matchers file is conditionally required only if RSpec is already defined by statsd-instrument. This explains the rails console behavior in my original report.

Some sort of load order difference between spring and bundle exec?

I found a workaround: require 'statsd/instrument/matchers' in my spec_helper.rb.

russellsilva avatar Nov 06 '15 21:11 russellsilva

Interesting! I'll reopen but pass the torch, spring isn't really my domain.

kaspth avatar Nov 06 '15 22:11 kaspth