search
LoginSignup
0

posted at

Rails6でシステムスペック(capybara 導入)

はじめに

先日、Rails6 でシステムスペックのテスト実行の際に Capybara が導入されておらずエラーが発生してしまいました。
Rails6 では Capybara はデフォルトでインストールされているはずなのに何故かエラーとなってしまう...。
その原因としていくつか勘違いしていた事がありましたので、まとめたいと思います。

開発環境

  • Rails 6.1.4
  • ruby 2.7.3
  • rspec-rails 5.1.2

Capybara の設定

spec_hepler.rb に capybara の設定を追加します

spec_hepler.rb
# 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 ドライバを使うように設定します。

参考:

公式

Capybaraチートシート

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とすることでローカルにインストールされていないことに気づき簡単に原因追求できたかもしれません。

参考:

bundler、bundle execについて

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 はプロジェクトで使用できない

とても初歩的なことばかりですが、今回こうして知る事ができてよかったです。

間違っている点・勘違いしている点などありましたら、ご教授いただけると幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0