こんにちは!
今回はFailure/Error: require_relative "../config/environment"のエラーでRSpecが動かないときの対処法についてまとめます。
事象
- Ruby on Rails 6 実践ガイドのChapter7で、RSpecを実行したら下記のエラーが出てテストが実行できなかった
An error occurred while loading ./spec/requests/admin/top_spec.rb. Failure/Error: require_relative "../config/environment" SyntaxError: /usr/local/bundle/gems/factory_bot-6.4.5/lib/factory_bot/evaluator.rb:38: syntax error, unexpected ... ...method_missing(method_name, ...) ... ^~~ /usr/local/bundle/gems/factory_bot-6.4.5/lib/factory_bot/evaluator.rb:40: syntax error, unexpected ..., expecting ')' ...@instance.send(method_name, ...) ... ^~~ /usr/local/bundle/gems/factory_bot-6.4.5/lib/factory_bot/evaluator.rb:42: syntax error, unexpected ..., expecting ')' ...unner.new.send(method_name, ...) ... ^~~ /usr/local/bundle/gems/factory_bot-6.4.5/lib/factory_bot/evaluator.rb:80: syntax error, unexpected end-of-input, expecting end # /usr/local/bundle/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' # /usr/local/bundle/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:324:in `block in require' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:291:in `load_dependency' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:324:in `require' # /usr/local/bundle/gems/factory_bot-6.4.5/lib/factory_bot.rb:25:in `<main>' # /usr/local/bundle/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' # /usr/local/bundle/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:324:in `block in require' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:291:in `load_dependency' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:324:in `require' # /usr/local/bundle/gems/factory_bot_rails-6.4.3/lib/factory_bot_rails/railtie.rb:3:in `<main>' # /usr/local/bundle/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' # /usr/local/bundle/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:324:in `block in require' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:291:in `load_dependency' # /usr/local/bundle/gems/activesupport-6.0.6.1/lib/active_support/dependencies.rb:324:in `require' # /usr/local/bundle/gems/factory_bot_rails-6.4.3/lib/factory_bot_rails.rb:1:in `<main>' # ./config/application.rb:5:in `<top (required)>' # ./config/environment.rb:2:in `require_relative' # ./config/environment.rb:2:in `<top (required)>' # ./spec/rails_helper.rb:3:in `require_relative' # ./spec/rails_helper.rb:3:in `<top (required)>' # ./spec/requests/admin/top_spec.rb:1:in `<top (required)>'
環境
試したこと
- specファイルの中身をコメントアウトしてみた
- RSpecを実行するだけでエラーが出た
require_relative "../config/environment"
の記載がある箇所を探すと、rails_helper.rb
とtest_helper.rb
が該当したので、どちらの記述が影響があるか変更して試したrails_helper.rb
の記述が影響していることがわかった
- 書籍のサポートサイトから
rails_helper.rb
のソースコードを探して該当箇所を見つけたrequire File.expand_path('../config/environment', __dir__)
という書籍と違うコードが書かれていたので、これが原因かと思い書き換えたが同様のエラーが出た
- エラーメッセージを読むと
factory_bot
のgemでunexpected end-of-input, expecting end
などのエラーが出ていたため、factory_bot
のソースコードを開いてみた- 該当箇所に
end
の抜けなどはなかった
- 該当箇所に
- 書籍のサポートサイトの
factory_bot
のバージョンは5、自分のインストールしたfactory_bot
は6であることに気づいたfactory_bot
のバージョンを5に下げることで解決した
対処法
- Gemfileの
gem "factory_bot_rails"
の記述をgem "factory_bot_rails", "~> 5"
に変更し、bundle updateした
おわりに
今回はRSpecが動かなかったエラーの対処法についてまとめました。不慣れなDocker上でRailsを動かしているので、エラーの原因箇所がどこにあるのか探すのが大変ですね。Dockerに何か原因があるのかなども考えてしまいました。結局1時間半近く解決に時間がかかってしまいました。最新の書籍でない場合は特にGemのバージョン関係を最初に疑うべきだなと改めて思いました。
58/100