Red > Green > Refactor > Red

cycle is based on desire

Gemfile の グループ化, 明確にしないと予期せぬエラーが起きる (書き留め)

Gemfile のグループ化は明確にしよう、という話

お題のGemfile

source 'https://rubygems.org'

gem 'rails', '~> 4.2'
gem 'sqlite3'
gem 'coffee-rails', '~> 4.0.0'
gem 'haml'
gem 'jbuilder', '~> 2.0'
gem 'jquery-rails'
gem 'faraday'
gem 'rails_config'
gem 'ransack'
gem 'sass-rails'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'spring', group: :development
gem 'therubyracer',  platforms: :ruby
gem 'uglifier', '>= 1.3.0'

group :development, :test do
  gem 'erb2haml'
  gem 'faker'
  gem 'factory_girl_rails'
  gem 'json_spec'
  gem 'pry-byebug'
  gem 'pry-rails'
  gem 'rspec'
  gem 'rspec-given'
  gem 'rspec-rails'
  gem 'rspec-parameterized'
  gem 'nokogiri'
end

本題

この Gemfile で rails s -e development すると

rspec, rspec-rails, nokogiri など(Gem そのもの、関連するファイル群)

がコマンド実行時の、ファイル読込み対象になる

(confing/application.rbBundler.require(*Rails.groups) より)

従って、以下のようなことが起こり得る

  • テスト環境でしか定義されない定数を spec/support/*.rb に定義していた
  • rails s -e development を実行する
  • spec/support/*.rb が読み込まれる
  • テスト用定数への「undefined local variable or method」が発生し、サーバー落ちする

ので、各3種(プロダクション, 開発, テスト) のグループ化は明確にしよう

訂正 Gemfile はこっち(要精査)

source 'https://rubygems.org'

gem 'rails', '~> 4.2'
gem 'sqlite3'
gem 'coffee-rails', '~> 4.0.0'
gem 'haml'
gem 'jbuilder', '~> 2.0'
gem 'jquery-rails'
gem 'faraday'
gem 'rails_config'
gem 'ransack'
gem 'sass-rails'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'spring', group: :development
gem 'therubyracer',  platforms: :ruby
gem 'uglifier', '>= 1.3.0'

group :development do
  gem 'erb2haml'
end

group :test do
  gem 'faker'
  gem 'factory_girl_rails'
  gem 'json_spec'
  gem 'pry-byebug'
  gem 'pry-rails'
  gem 'rspec'
  gem 'rspec-given'
  gem 'rspec-rails'
  gem 'rspec-parameterized'
  gem 'nokogiri'
end