【Rails】RSpecとCapybaraのFeatureテスト書き方まとめ

スポンサーリンク

 

こんにちは、Railsエンジニアにょけん(@nyoken_box)です。

「RSoec」と「Capybara」でFeatureテストを書く手順をまとめました。

Featureテストを行う理由って?

Featureテストは、アプリの利用者が使うものと全く同じWeb フォームを使ってテストできます。

これがコントローラテストと大きく異なる点。

コントローラテストは直接パラメータを送信して検証するため、「そもそもブラウザにフォームが用意されていなかった」みたいな凡ミスが防げないんだよね。

 

スポンサーリンク

Rails5.0以前の場合は、「Capybara」をGemfileに追加

「Capybara」はブラウザ操作をシミュレートするgemで、Featureテストにうってつけです。

Capybara を使うと、「リンクのクリック」「フォームの入力」「画面表示の検証」などをコマンドでシミュレートできるよ!

で、この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. トップページへアクセス
  2. サインインページへ遷移
  3. メアドとパスワードを入力してログイン
  4. タスク作成ページへ遷移
  5. タスク名、タスクの説明を入力し、作成ボタンをクリック
  6. タスク作成成功のフラッシュメッセージが表示されること

これらの動作を行なった結果、タスクが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: “メニュー名”
    →セレクトメニューからオプションを選択する

全容はコチラの公式ドキュメントをご参照ください。

 

Twitterフォローしてね!!!

有益な無益をつぶやくよ↓↓↓

にょけん

スポンサーリンク