記事概要
Ruby on Railsのコントローラー単体テストについて、まとめる
前提
- Ruby on Railsでアプリケーションを作成している
- アプリにRSpecをインストールしている
- RSpecの設定が完了している
RSpecとは
コントローラーテストコードを書く方針
あるアクションにリクエストを送ったとき、想定通りのレスポンスが生成されるかどうかを確かめる
Request Spec
RSpecが提供している、コントローラーのテストコードを書くために特化した手法
RSpecの導入が完了していれば使用できる
手順(Request Specのインストール)
- RSpecをインストールする
詳細は、こちらを参照
手順(テストファイル作成)
- モデルのテストファイルを生成するため、下記コマンドを実行する
# アプリのディレクトリに移動 % cd ~/[アプリ名] % rails g rspec:request [コントローラー名]
-
spec/requests/[コントローラー名]_spec.rb
が作成されたことを確認する
手順(テストケースの記述)
-
[コントローラー名]_spec.rbにテストケースを記述する
- 機能別・条件別・テスト詳細別にグループ分けを行う
- 保存するデータ(インスタンス)を作成する
- テストコードを記述する
※各テストコードが想定通りに実行できるかを確認するため、rails c
コマンドでコンソールを起動して確認を行う
手順(テストファイルの実行)
- テストファイルを実行するため、下記コマンドを実行する
# アプリのディレクトリに移動 % cd ~/[アプリ名] % bundle exec rspec spec/requests/コントローラー名_spec.rb
- ターミナル.appで正常完了していることを確認する
結果が緑色で表示されれば実行成功
確認方法
レスポンスのステータス
コントローラーのアクションにリクエストすると、レスポンスが返ってくるかを確認する
-
rails routes
コマンドで、ルーティングパスを確認する - テストファイルに、
get [Prefix]_path
とbinding.pry
を記載するコントローラー名_spec.rbit 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do get root_path binding.pry end
- テストファイルを実行する
- コンソールに、
response.status
と入力する - HTTPステータスコードが表示される
- HTTPステータスコードを確認し、テストコードを記述する
コントローラー名_spec.rb
# ステータスコード=200(正常)のケース it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do get root_path expect(response.status).to eq 200 end
- テストファイルを実行する
レスポンスに含まれる、保存済みのDBデータ
保存済みのDBデータがレスポンスに含まれることを確認する
-
rails routes
コマンドで、ルーティングパスを確認する - テストファイルに、
get [Prefix]_path
とbinding.pry
を記載するコントローラー名_spec.rbit 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do get root_path binding.pry end
- テストファイルを実行する
- コンソールに、
response.body
と入力する - HTMLの情報が表示される
- 保存済みのDBデータが含まれているか確認するテストコードを記述する
コントローラー名_spec.rb
# @tweet.textの情報が含まれているかを確認するケース it 'indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する' do get root_path expect(response.body).to include(@tweet.text) end
- テストファイルを実行する
レスポンスに含まれる、HTMLの文字
HTMLのタグでブラウザ表示している文字がレスポンスに含まれることを確認する
-
get [Prefix]_path
とexpectation
を記載するコントローラー名_spec.rbit 'indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する' do get root_path expect(response.body).to include('投稿を検索する') end
- テストファイルを実行する
参考コード
require 'rails_helper'
describe TweetsController, type: :request do
before do
@tweet = FactoryBot.create(:tweet)
end
describe 'GET #index' do
it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do
get root_path
expect(response.status).to eq 200
end
it 'indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する' do
get root_path
expect(response.body).to include(@tweet.text)
end
end
describe 'GET #show' do
it 'showアクションにリクエストするとレスポンスにコメント一覧表示部分が存在する' do
get tweet_path(@tweet)
expect(response.body).to include('<コメント一覧>')
end
end
end
Ruby on Railsまとめ