Help us understand the problem. What is going on with this article?

【rails tutorial 3.4.4】ローカル環境でテストコードを通す方法

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にする。

/config/application.rb
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に反映される。それを読み込んで処理等が実行される。

参考

https://discuss.circleci.com/t/missing-secret-key-base-for-test-environment-set-this-value-in-config-secrets-yml/5179/2

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした