はじめに
先日、Rails6 でシステムスペックのテスト実行の際に Capybara が導入されておらずエラーが発生してしまいました。
Rails6 では Capybara はデフォルトでインストールされているはずなのに何故かエラーとなってしまう...。
その原因としていくつか勘違いしていた事がありましたので、まとめたいと思います。
開発環境
- Rails 6.1.4
- ruby 2.7.3
- rspec-rails 5.1.2
Capybara の設定
spec_hepler.rb に capybara の設定を追加します
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
require 'capybara/rspec'
RSpec.configure do |config|
config.before(:each, type: :system) do
driven_by :rack_test
end
config.before(:each, type: :system, js: true) do
driven_by :selenium_chrome_headless
end
end
上記の設定は、実行するタスクによって使うドライバを分けます。JavaScript を使ったテストを実行する場合は Chrome を使うように、そうでない場合はデフォルトの Rack::Test ドライバを使うように設定します。
参考:
rspec-rails 3.7の新機能!System Specを使ってみた
エラー原因の調査
Capybara の設定をしてシステムスペックでのテストを実行してみるとエラーが発生。Capybara が読み込めていないためメソッドが使えず example で失敗してしまいます。Rails5.1 以降ではデフォルトでインストールされているはずなのになぜありませんと怒られてしまうのか。
(注)↓ここからは私が踏んだ手順であって本来はこのようなことはしません。かなり遠回りに勝つ無駄に解決しました
Gem がインストールされているか確認
Gem がインストールされているか確認してみます。
(本来であればこの段階で簡単に気づけましたが、知識不足でかなり遠回りなことをしています。)
> gem list capybara
*** LOCAL GEMS ***
capybara (3.37.1, 3.35.3)
インストールされています。ではなぜか?
公式を見てみると
If the application that you are testing is a Rails app, add this line to your test helper file:
require 'capybara/rails'
とあり、Rails アプリの場合はrequire 'capybara/rails'
の追加も必要そう?なので追加してみるも変わらずエラー。
解決まで
そもそも Rails5.1 以降はデフォルトでインストールされてるはずだし、gem もインストールされていたのになぜ Capybara が読み込まれないのか。
Gemfile
を確認してみるとgroup :test do ~ end
間が全く記載されていませんでした。Gemfile.lock
も確認してみるとcapybara
がありませんでした。
結論
アプリにgem 'capybara'
がインストールされていなかった。
なぜ早く気づけなかったのか。その原因としていくつか勘違いしていた事がありました。
グローバルの gem について
グローバルにインストールされている gem は明示的に追加しなくてもアプリ内で使えると勘違いしていました。
グローバル
、ローカル
、bundle exec コマンド
らへんのことについて、まだ理解しきれていないことがありました。
そこについての知識があれば今回の件であればgem list
を調べる際にもbundle exec gem list capybara
とすることでローカルにインストールされていないことに気づき簡単に原因追求できたかもしれません。
参考:
rails new の際の -T オプションについて
-T オプション
をつけると Gemfile のgroup :test do ~ end
間の gem のインストールもスキップされることを知りませんでした。-T オプション は Minitest
で使用される test ディレクトリが作成されないだけだど勘違いしていました。
こちらもその知識があれば、そもそも今回のようなことにはなりませんでした。
まとめ
今回のエラーは簡単に解決できるにもかかわらず、知識不足によりかなり遠回りな解決となってしまいました。
今回学んだこととして
- rails new の
-T オプション
は Gemfile のgroup :test do ~ end
間の gem のインストールもスキップされる - 現在のプロジェクト内でのコマンドの場合は
bundle exec
をつける -
Gemfile.lock
にない gem はプロジェクトで使用できない
とても初歩的なことばかりですが、今回こうして知る事ができてよかったです。
間違っている点・勘違いしている点などありましたら、ご教授いただけると幸いです。