はじめに
これまでに引き続き、現場で使える Ruby on Rails 5速習実践ガイドのアウトプットを投稿します!
今回はrspecについてです!
タスク管理アプリケーションを例に進めていきます。
目次
Rspecの準備
・gemをインストール
Gemfileの
group :development, :test do
のブロックに以下を追記します。
gem 'rspec-rails', '~> 3.7'
記述後bundle install
でgemをインストールします。完了したら、以下のコマンドを実行し、RSpecに必要なディレクトリや設定ファイルを作成します。
rails g spec:install
・testディレクトリ削除
rails new
でアプリケーションを立ち上げた時に自動で作成されるtestディレクトリを削除します。なぜなら、Rspecのファイルは、specディレクトリの中に作成するからです。
rm -r ./test
・Capybaraを使うためにspec_helper.rbを編集
Capybaraはrails new
をした際にインストールされているため、機能の読み込み
と実行するドライバの設定
を記述します。
require 'capybara/spec'
config.before(:each, type: :system) do
driven_by :selenium_chrome_headless
end
・FactoryBotのインストール
Gemfileの
group :development, :test do
のブロックに以下を追記します。
gem 'factory_bot_rails', '~> 4.11'
Specの書き方
ここでは、タスク管理アプリケーションの一覧表示に関するテストを例にします。
describe '一覧表示機能' do
context 'Aさんがログインしているとき' do
before do
# テスト条件を満たすよう処理を記述する
end
it 'Aさんの投稿だけが表示される' do
# 期待する動作を記述する
end
end
end
上記の例では条件が一つですが、複数ある場合はcontextをネストすることもできます。
FactoryBotでテストデータを作成
spec/factories/users.rb
を作成し、Userモデルのデータを記述します。
FactoryBot.define do
factory :user do
name { 'テストユーザー' }
email { 'test@example.com' }
password { 'password' }
end
end
factory :user
の記述で、railsがUserモデルのテストデータだなと、解釈してくれます。もし、違う名前をつけたいときは、以下のようにclassを明記します。
factory :test_user, class: User do
次にいま作成したユーザーに紐づく投稿データを作成します。先程と同様に、spec/factories/tasks.rb
を作成します。
FactoryBot.define do
factory :task do
name { 'テストを作成する' }
description { '必要なものをインストールし、作成する。' }
user
end
end
上記のuser
は、先ほど作成した:user
のデータに紐づくものと定義しています。こちらも、モデル名と違うテストデータを紐付けるときはuser
の箇所を以下のように書きます。
association :user, factory: :admin_user
テストを書く
まずは、日本語で枠組みを作成していきます。
require 'rails_helper'
describe '一覧表示機能' do
before do
# ユーザーAを作成する
# ユーザーAのタスクを作成する
end
context 'ユーザーAがログインしているとき' do
before do
# ユーザーAでログイン
# ログイン画面に遷移
# メールアドレスを入力
# パスワードを入力
# ログインボタンを押す
end
it 'ユーザーAが作成したタスクが表示される'
# 作成されたタスクが表示されている
end
end
end
テストの枠組みができたら、実際にテストコードを書いていきます!
require 'rails_helper'
describe '一覧表示機能' do
before do
# ユーザーAを作成する
user_a = FactoryBot.create(:user)
# ユーザーAのタスクを作成する
FactoryBot.create(:task, name: "最初のタスク", user: user_a)
end
context 'ユーザーAがログインしているとき' do
before do
# ユーザーAでログイン
# ログイン画面に遷移(ログイン画面のpathにvisit)
visit login_path
# メールアドレスを入力(labelの名称を指定します)
fill_in 'メールアドレス', with: 'a@example.com'
# パスワードを入力(labelの名称を指定します)
fill_in 'パスワード', with: 'password'
# ログインボタンを押す
click_botton 'ログインボタン'
end
it 'ユーザーAが作成したタスクが表示される'
# 作成されたタスクが表示されている
expect(page).to have_content '最初のタスク'
end
end
end