LoginSignup
0
0

More than 3 years have passed since last update.

【Ruby on Rails】コントローラーの単体テストコードについてまとめ(RSpec)

Posted at

初学者です。
テストコードがなぜか大好きです。

今回はコントローラーの単体テストコードについてまとめます。
私はRSpecを利用しています。

コントローラーのテストコードを書く方針は
アクションにリクエストを送ったとき想定通りのレスポンスが返されるかどうかを確かめる
ことです。

ちなみにモデルの単体テストコードについてはこちらにまとめています。

前提条件

  • pry-railsを導入済みである
  • FactoryBotを導入済みである
  • RSpec導入済みである

上記については以下の記事にまとめています。

【Ruby on Rails】デバッグツール(pry-rails)
【Ruby on Rails】FactoryBotとFakerについてまとめ
【Ruby on Rails】モデルの単体テストコードについてまとめ(RSpec)

準備

下記コマンドでテストコード用のファイルを生成します。
成功すればspec/requests配下に該当のファイルが生成されます。

ターミナル
rails g rspec:request samples

テストコード

describeitで検証すべき項目を出していきます。

spec/requests/samples_spec.rb
require 'rails_helper'
describe SamplesController, type: :request do

  before do
    @sample = FactoryBot.create(:sample)
  end

  describe 'GET #index' do
    it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 
    end
    it 'indexアクションにリクエストするとレスポンスに投稿済みのテキストが存在する' do 
    end
    it 'indexアクションにリクエストするとレスポンスに投稿済みの画像URLが存在する' do 
    end
    it 'indexアクションにリクエストするとレスポンスに投稿フォームが存在する' do 
    end
  end
end

FactoryBotはbuildではなくcreateにしています。
今回のテストではDBにデータが存在する必要があるのでcreateです。
テストする度にデータが作られ、終わると削除されます。便利!

ではindexアクションにリクエストすると正常にレスポンスが返ってくるのテストコードを書いていきます。

spec/requests/samples_spec.rb
it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 

# 以下を追加
  get root_path
  binding.pry

end

解説します。
get ○○_pathでどのパスにリクエストを送りたいかを書きます。
rails routesで確認してそのパスを記述します。

この状態で下記コマンドでテストコードを実行します。

ターミナル
bundle exec rspec spec/requests/samples_spec.rb

binding.pryしてるので処理が途中で止まりターミナルに入力できるようになっていると思います。
下記のコマンドを入力します。

ターミナル
response.status

そうするとそのレスポンスのステータスコードが出力されます。
HTTP通信においてステータスコードは以下のようになっています。

ステータスコード 内容
100~ 処理継続中
200~ 処理成功
300~ リダイレクト
400~ クライアント側のエラー
500~ サーバーエラー

つまり今回の場合はresponse.status200がステータスコードで返ってくればOKということです。

正常に200が返ってきたらテストコードを編集します。

spec/requests/samples_spec.rb
it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 
  get root_path

# 以下に編集
  expect(response.status).to eq 200

end

これでテストコードを実行して成功すればOKです。

次にindexアクションにリクエストするとレスポンスに投稿済みのテキストが存在するのテストコードを書いていきます。

spec/requests/samples_spec.rb
it 'indexアクションにリクエストするとレスポンスに投稿済みのテキストが存在する' do 

# 以下を追加
  get root_path
  expect(response.body).to include(@sample.text)

end

解説します。
response.bodyと記述してincludeで引数の内容(今回はテキスト)が存在するかを確認してます。bodyでブラウザに表示されるHTMLの情報を抜き出すことができます。

これでテストコードを実行して成功すればOKです。

次にindexアクションにリクエストするとレスポンスに投稿済みの画像URLが存在するのテストコードを書いていきます。ほぼ先ほどと同じです。

spec/requests/samples_spec.rb
it 'indexアクションにリクエストするとレスポンスに投稿済みの画像URLが存在する' do 
  get root_path
  expect(response.body).to include(@sample.image)
end

これでテストコードを実行して成功すればOKです。

次にindexアクションにリクエストするとレスポンスに投稿フォームが存在するのテストコードを書いていきます。
難しく考えずにその文言が存在するかを確認できればOKなので下記のようになります。

spec/requests/samples_spec.rb
it 'indexアクションにリクエストするとレスポンスに投稿フォームが存在する' do 
  get root_path
  expect(response.body).to include('投稿する')
end

これでテストコードを実行して成功すればOKです。

他のアクションについてもほぼ書き方は同じです!
コントローラーの単体テストコードは結合テストとかぶる部分もありますよねー。

以上です。

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0