С точки зрения Rails, тестовая среда настроена и загружена, как и любой другой среде, такой как production
или development
. Вы можете увидеть это префикс RAILS_ENV=test
для многих собственных команд Rails, например. RAILS_ENV=test rails c
загрузит консоль рельсов для тестовой среды и т. Д. Аналогично, вся тестовая конфигурация в Rails определена в test.rb
в вашей папке config/environments
.
Однако, когда вы запустите спецификации с rspec spec
, вы на самом деле начинаете бегун RSpec, который, для большинства намерений и целей, работает независимо от Rails (даже с rspec-rails
драгоценным камнем).
По соглашению, когда RSpec запускает первое, что он делает, читается командная строка args из .rspec
в текущем каталоге, если она существует. Затем он запускает spec_helper.rb
(а также rails_helper.rb
для rspec-rails
3+). Это на самом деле spec_helper.rb
, который делает всю тяжелую-лифтинг при загрузке среды Rails для испытаний, а также с любым из модулей, которые вы используете в тестах, таких как DatabaseCleaner
, FactoryGirl
и т.д.
Если вам интересно, как RSpec подключается к Rails, основная часть его выполняется в этой строке, которая загружает Rails.
require File.expand_path('../../config/environment', __FILE__)
Теперь, что касается вашего вопроса, без ENV['RAILS_ENV'] ||= 'test'
заявления, выше линия будет загружать Rails в среде по умолчанию (разработка), который является не то, что вы хотите, так как любые драгоценные камни не в :test
группы будут не загружается, а environments/test.rb
не загружается.
TL; DR Тестовая конфигурация
обрабатывается двумя файлами: spec/spec_helper.rb
(иногда называемый rails_helper.rb
) и config/environments/test.rb
. Первая конфигурирует RSpec и любые объекты и модули, которые будут использоваться специально в файлах, используемых в spec
, последняя конфигурирует ваше приложение Rails.Опускание ENV['RAILS_ENV'] ||= test
загружает среду разработки и gemset вместо тестовой среды и gemset, поэтому вы получаете массу ошибок.
Aaaah * похлопывание лоб *, конечно! –