Spring And Failing Specs
03 MARCH 2014Spring will be included in Rails 4.1 as the defacto Application Preloader. It's similar to Zeus which keeps your application running in the background during development, so that any rake or spec command will run speedily without having to reload the app.
Anyway, I was using spring, spring-commands-rspec and enumerize gems in my app
and was running specs with spring rspec when this happened:
$> spring rspec
........F.............................
Failures:
1) Feedback validations
Failure/Error: it { should enumerize(:emotion).in(:happy, :sad) }
NoMethodError:
undefined method `enumerize' for #<RSpec::Core::ExampleGroup::Nested_3::Nested_2:0x000001029bcd20>
# ./spec/models/feedback_spec.rb:22:in `block (3 levels) in <top (required)>'
# -e:1:in `<main>'
Finished in 0.27399 seconds
38 examples, 1 failure
However, if I just do rspec, the specs passed!
$> rspec
......................................
Finished in 0.27061 seconds
38 examples, 0 failures
Randomized with seed 2852
Dug into the problem and found that this was a loading issue with enumerize.
This was how the enumerize matchers were loaded:
if defined?(::RSpec)
require 'enumerize/integrations/rspec'
endAnd it works fine for plain rspec command because rspec loads before rails.
However, when spring starts the application, rspec is not yet loaded and so
the matchers will not be required as well.
The fix is to load rspec like this:
begin
require 'rspec/matchers'
rescue LoadError
else
require 'enumerize/integrations/rspec'
endThis makes sure that the enumerize matchers will only required when rspec/matchers can be required without errors,
which means it will only load in dev or test environment because you shouldn't have rspec bundled in your production environment.
Keep this in mind when you encounter weird failing specs when using spring.