見出し画像

[output]コントローラー単体テスト

コントローラーの単体テストについて。

コントローラーのテストは、リクエストに対して想定したレスポンスが生成されるか確認する。

例えば、レスポンスの情報を使って、
・正常にレスポンスが返ってきたかをHTTPステータスコードで
・そのページに表示されるはずの情報が存在するかをbodyの情報で
確認する。

詳細は、後ほど。
まずは、コントローラーのテストファイルの作成から。

これには、rails g rspec:requestコマンドを使用する。
rails g rspec:request controllersで実行。

rails g rspec:controllerコマンドも存在するが、
こちらはアクションに対してテストを実装していくの対し、
requestはパスに対して実行していく。
requestが現在主流のため、こちらを利用する。

コマンド実行で、テストコードを記述するファイルが生成される。
今回のコントローラーテストでは、
DBに保存したデータがレスポンスのビューで表示される。

ので、beforeでデータを作成しておく。
モデルではbuildを使用したが、今回は保存まで行いたいのでcreateを使用。
これはActiveRecordのcreateと同じ働きをする。

ただし、テスト用のデータベースに保存されること、
1回のテスト終了毎にデータが削除される点は異なる。

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

コントローラーのテストは、describeでアクションのグループ分けを行う。
it内で、コントローラーを動かす、リクエストすなわちパス&HTTPメソッドを記述するが、
これはget xxxx_pathという風に記述する。

getアクションで、prefix_pathにリクエストを送信、という意味である。

リクエスト送信後は、レスポンスが想定通りか確かめる記述を行う。

expectにはresponseを。
ただし、そのままでは情報が膨大なため、.statusや.bodyで抽出する。

処理の結果が成功かどうかは、.statusで 200かどうかを検証。

ステータスコード:内容
100~:処理の継続中
200~:処理の成功
300~:リダイレクト
400~:クライアントのエラー
500~:サーバーのエラー
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(@model.text)
   end

   it 'indexアクションにリクエストするとレスポンスに検索フォームが存在する' do
     get root_path
     expect(response.body).to include('入力して検索する') 
     #検索フォームのplaceholderが'入力して検索する'のため指定している
   end
 end
```