I was using RSpec/Guard without Spring before the upgrade from Rails 4.0 to 4.1 and all my tests were passing without any output other than green dots and green text. After upgrading and installing Spring along with whatever else I supposedly needed, I'm getting errors in my passing tests, and sometimes my tests don't pass due to 'uniqueness' errors.
Common error between passing and failing tests:
An error occurred in an after(:all) hook.
NameError: uninitialized constant Recipe
occurred at /home/user/.rvm/gems/ruby-2.1.0@global/gems/activesupport-4.1.0/lib/active_support/inflector/methods.rb:238:in 'const_get'
Now the after(:all) hook simply deletes all Manager::Wine objects (and a Manager::Wine object has_many recipes). Manager is a rails engine, and it has Wine and Recipe models. Nowhere in the Wine class does it specify the Recipe constant explicitly. But as I said before, this error didn't show up in regular RSpec/Guard tests until I upgraded and installed Spring.
The other failures are a result of 'attributes already been taken'. For example, a standard 'is valid factory' tests fail upon create() because of this. But I specified in RSpec:
config.before(:each) do
DatabaseCleaner.start
end
and I wasn't getting these errors in my randomized tests before Spring.
Gemfile snippet:
group :development, :test do
gem 'spring'
gem 'rspec-rails'
gem 'guard'
gem 'guard-rspec', require: false
gem 'spring-commands-rspec'
gem 'factory_girl_rails'
gem 'database_cleaner'
end
Guardfile contains:
guard :rspec, cmd:"spring rspec" do
Rails app_root/bin contains files:
rails
rake
rspec
spring
???
Really strange. I wasn't notified of this problem before, but the application no longer was able to determine the HABTM relationship between Wines and Recipes. I updated my models to include the join_table
argument and I no longer get the 'undefined constant' errors. I only found this out because I loaded the app in the browser and got a better error message to deal with. Still getting problems with 'duplicate entry' issues.
Also, I removed the destroy_all calls on each model as I think it's unnecessary considering DatabaseCleaner runs after each task.