Reputation: 13949
I am using the default test
for different purposes and I have decided to make a specific rspec
environment configuration for running the test suite.
However, I discovered that upon changing to ENV["RAILS_ENV"] ||= rspec
in my rails_helper.rb
file, suddenly a LOT of things are going wrong, constants are not being loaded (FactoryGirl, DatabaseCleaner, etc. throw uninitialized constant
errors)
My question is, where is the code that loads those guys in test environment ? Since I am planning to use this stage for other purposes than running automatic tests, I'm afraid this "out of nowhere" added configuration might not work well with what I am planning to do.
Upvotes: 2
Views: 881
Reputation: 11235
From the perspective of Rails, the test environment is configured and loaded like any other environment such as production
or development
. You can see this prefixing RAILS_ENV=test
to many of the native Rails commands e.g. RAILS_ENV=test rails c
will load the rails console for the test environment, and so on. Similarly, all test-specific configuration within Rails is defined in test.rb
in your config/environments
folder.
However, when you run your specs with rspec spec
, you're actually starting the RSpec runner, which, for most intents and purposes, runs independently of Rails (even with the rspec-rails
gem).
By convention, when RSpec starts the first thing it does is read command line args from the .rspec
in the current directory, if it exists. Then it runs spec_helper.rb
(and also rails_helper.rb
for rspec-rails
3+). It's actually the spec_helper.rb
which does all the heavy-lifting in loading the Rails environment for your tests, along with any of the modules you're using in tests, such as DatabaseCleaner
, FactoryGirl
, etc.
If you're wondering how RSpec hooks into Rails, the bulk of it is performed in this line, which bootstraps Rails.
require File.expand_path('../../config/environment', __FILE__)
Now, as to your question, without the ENV['RAILS_ENV'] ||= 'test'
statement, the above line will load Rails in the default environment (development), which isn't what you want, since any gems not in the :test
group will not be loaded, and environments/test.rb
will not be loaded either.
TL;DR
Test configuration is handled by two files: spec/spec_helper.rb
(sometimes named rails_helper.rb
) and config/environments/test.rb
. The former configures RSpec and any objects and modules which will be used specifically within the files used in spec
, the latter configures your Rails app itself. Omitting ENV['RAILS_ENV'] ||= test
loads the development environment and gemsets instead of the test environment and gemsets, which is why you're getting a ton of errors.
Upvotes: 2
Reputation: 9246
If you are getting uninitialized constant
errors for FactoryGirl, DatabaseCleaner etc, you most likely included them to test
group in your Gemfile
.
You should move them to rspec
group, eg:
# Gemfile
group :rspec do
gem 'factory_girl_rails', '~> 4.0'
gem 'faker'
end
Upvotes: 1