Failure/Error: require_relative "../config/environment"のエラーでRSpecが動かないときの対処法

こんにちは!

今回はFailure/Error: require_relative "../config/environment"のエラーで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.rbtest_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