railsチュートリアルをローカル環境で開発時に、
ルーティング、コントローラ、ビュー、テストにコードを正しく記述しているにも関わらず、テストが通らずエラーで解決に非常に時間がかかりました。
開発環境はvagrantで、テキストエディタはVScodeを使っています。
#エラー文
テスト実行時のエラーは以下になります。
DEPRECATION WARNING: You didn't set secret_key_base
. Read the upgrade documentation to learn more about this new config option. (called from block in class:StaticPagesControllerTest at /vagrant/re_learn/test/controllers/static_pages_controller_test.rb:23)
ERROR["test_should_get_help", StaticPagesControllerTest, 0.29687339199881535]
test_should_get_help#StaticPagesControllerTest (0.30s)
RuntimeError: RuntimeError: Missing secret_key_base
for 'test' environment, set this value in config/secrets.yml
test/controllers/static_pages_controller_test.rb:23:in `block in class:StaticPagesControllerTest'
#原因
・minitestのGemを入れてなかった
・railsのバージョン5.2未満だった
#説明
・テスト実行時はrspecやminitestなどをよく使いますが、勘違いしてrspecのGemを入れていたため、正常に動作しなかったです。
(当然ですねw)
・railsはバージョンが5.1から5.2にアップグレードする際に、大きな変更があったようで、secret_key_baseという秘密鍵の要求が必須だったものがなくなったようです。
つまり5.1系だと秘密鍵を要求されエラーになります。
railsチュートリアルで推奨されているバージョンが5.1.6なので~~(私含め初学者の方が)~~陥りやすい点かと思います。
※補足
herokuでデプロイ時にはrailsバージョンを5.1にした方がいい場合があるので、デプロイ時のみバージョンを下げるもしくは、発生するエラーに対処する必要があるかもしれません。
#対策
・minitestのGemを追加
/Gemfile
group :test do
gem 'rails-controller-testing', '1.0.2'
gem 'minitest', '5.10.3'
gem 'minitest-reporters', '1.1.14'
gem 'guard', '2.13.0'
gem 'guard-minitest', '2.4.4'
end
bandle installを実行
$ bundle install
・railsのバージョンを5.2以上に変更
config.load_defaults を5.2にする。
require_relative 'boot'
require 'rails/all'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
module アプリ名
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 5.2
# config.active_record.sqlite3.represent_boolean_as_integer = true
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
end
end
アプリで使っているrailsのバージョンを確認
bundle exec rails -v
=> Rails 5.1.6
Gemfile内のrailsのバージョンを5.2以上にして,
bundle updateを実行
gem 'rails', '~> 5.2.0'
$ bundle update rails
バージョンを確認すると
$ rails -v
=> Rails 5.2.4.1
これでテストを実行すると、正常に動作しました。
#まとめ
・機能面でのエラーがあったらその使いたい機能は何であるか認識することと、それがGemfileにあるか確認する。
・railsのバージョンは慎重に扱う。
・railsはシステムの脆弱性の改善を施してから、バージョンアップしていることが多いのでバージョンを下げる行為はなるべく避けた方が良い。
・Gemfileに書いたことはbundle installによってGemfile.lockに反映される。それを読み込んで処理等が実行される。