こんにちは、Railsエンジニアにょけんです。
「RSoec」と「Capybara」でFeatureテストを書く手順をまとめました。
Featureテストは、アプリの利用者が使うものと全く同じWeb フォームを使ってテストできます。
これがコントローラテストと大きく異なる点。
Rails5.0以前の場合は、「Capybara」をGemfileに追加
「Capybara」はブラウザ操作をシミュレートするgemで、Featureテストにうってつけです。
で、このCapybaraはRails5.1以降にはデフォルトで入っています。
Rails5.0以前であれば、テスト環境にCapybaraをインストールしましょう。
[Gemfile]
group :test do gem 'capybara' end
[ターミナル]
$ bundle install
「Capybara」をRSpecで使えるように設定する
Capybaraがアプリに入っていても、それをRSpecで使うように設定しないと意味がありません。
てわけで、[spec/rails_helper.rb]に、以下オレンジ色の箇所を追加しましょう。
[spec/rails_helper.rb]
# This file is copied to spec/ when you run 'rails generate # rspec:install' ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) # Prevent database truncation if the environment is production abort("The Rails environment is running in production mode!") if \ Rails.env.production? require 'spec_helper' require 'rspec/rails' # Add additional requires below this line. Rails is not loaded until this point! require 'capybara/rspec' # 以下省略...
実際にFeatureテストを書いてみよう
カンタンな例として、UserモデルとTaskモデルがあり、UserがTaskを作成するという動作をテストしてみましょう。(「User:Task = 1:多」の関連付けがある想定です)
「rails generate rspec:feature tasks」でテスト用のファイルを作成し、ファイル内でブラウザの動きをシミュレートしましょう。
トップページからUserがTaskを作成するには、以下の手順を踏みます。
- トップページへアクセス
- サインインページへ遷移
- メアドとパスワードを入力してログイン
- タスク作成ページへ遷移
- タスク名、タスクの説明を入力し、作成ボタンをクリック
- タスク作成成功のフラッシュメッセージが表示されること
これらの動作を行なった結果、タスクが1つ増えるということをテストできればOKですね?
[spec/features/tasks_spec.rb]
require 'rails_helper' RSpec.feature "Tasks", type: :feature do # ユーザーは新しいプロジェクトを作成する scenario "user creates a new task" do # ユーザーを作成 @user = User.create( first_name: "John", last_name: "Brawn", email: "test@example.com", password: "i-am-john" ) # トップページへアクセス visit root_path # サインインページへ遷移 click_link "Sign in" # メアドとパスワードを入力してログイン fill_in "Email", with: @user.email fill_in "Password", with: @user.password click_button "Log in" # タスク作成時に、@userのタスクが1つ増えることを記載 expect { # タスク作成ページへ遷移 click_link "New Task" # タスク名、タスクの説明を入力し、作成ボタンをクリック fill_in "Name", with: "Test Task" fill_in "Description", with: "This is Test" click_button "Create Task" # タスク作成成功のフラッシュメッセージが表示されること expect(page).to have_content "Task was successfully created" }.to change(@user.tasks, :count).by(1) end end
上記で使った「visit」「click_link」「fill_in」などが、Capybara導入で使えるようになったコマンドです。
参考として、よく使うコマンドも載せておきますね。
- visit “URL名”
→URLへアクセス - click_link “リンク名”
→リンクをクリック - click_button “ボタン名”
→ボタンをクリック - fill_in “フォーム名”, with: “入力値”
→フォームに入力値を入力 - check “チェックボックス名”
→チェックボックスにチェックを入れる - uncheck “チェックボックス名”
→チェックボックスからチェックを外す - choose “ラジオボタンのラベル名”
→ラジオボタンのラベルを選択する - select “オプション名”, from: “メニュー名”
→セレクトメニューからオプションを選択する
全容はコチラの公式ドキュメントをご参照ください。
コメント