LoginSignup
2
1

More than 1 year has passed since last update.

🔰【初学者用】RSpecでテストコードを書こう!③【コントローラーの単体テスト簡単な実装例】

Posted at

はじめに

①🔰【初学者用】RSpecでテストコードを書こう!【概念・準備】

②🔰【初学者用】RSpecでテストコードを書こう!②【簡単な実装例】

今日の投稿は③になります!
前回はモデルの単体テストを行ったので今回はコントローラーの単体テストです。

コントローラーの単体テストはどんなテスト?

モデルのテストでは、インスタンスを生成し、それがモデルに規定した通りの挙動になるか(バリデーションが正しく働くかなど)を確かめます。
コントローラーのテストでは、あるアクションにリクエストを送ったとき、想定通りのレスポンスが生成されるかどうかを確かめます。

Request Spec

RSpecの導入が完了していれば使用できる、コントローラーのテストコードを書くために特化した手法のこと。

テストコードの具体的実装

まずはファイルを生成します!今回は簡単なツイートアプリを作っている想定です!

ターミナル
rails g rspec:request tweets

実行後はrequestディレクトリに、tweets_spec.rbが生成されます。
続いてテストコードを記述していきます。

spec/requests/tweets_spec.rb
require 'rails_helper'
describe TweetsController, type: :request do

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

  describe 'GET #index' do
    it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 
    get tweet_path(@tweet)
     expect(response.status).to eq 200
    end
    it 'indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する' do 
    get tweet_path(@tweet)
      expect(response.body).to include(@tweet.text)
    end
    #一部省略
  end
end

前回同様1つづつ説明していきますね!

create

ActiveRecordのcreateメソッドと同じです!
buildとほぼ同じ働きをしますが、createの場合はテスト用のDBに値が保存されます。
※テスト後にはテスト用に保存された値が削除されます。

get

get 〇〇_pathのように、どこのパスにリクエストを送りたいかを記述します。
ターミナルでrails routesを実行して確認します。

response.status

response.statusと実行することによって、そのレスポンスのHTTPステータスコードを出力できます。
HTTPステータスコードは以下に記述します。

response.body

response.bodyと記述すると、ブラウザに表示されるHTMLの情報を抜き出すことができます。

200とは?(HTTPステータスコード)

記述内に200とありますがこれは一体なんの数字でしょうか?
実はこれ、HTTPステータスコードと言って通信の処理がどのような結果になったかを表す数字です。
以下に主なステータスコードをまとめておきます。

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

ここまでの記述が理解できたらテストコードを実行しましょう!

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

response.bodyではそのページでしか返ってこないレスポンスをテストするようにしてます!
例えば投稿を検索するためのページがあったとしてそこには検索フォームがあるはずです。検索ページをテストする際はその検索フォームがあるかどうかでテストするというイメージです。

終わりに

なんとなく流れはつかめましたか?
モデルの単体テストコードに比べたらボリュームにかけますが、次の結合テストがボリューミーなので、お楽しみに!笑

2
1
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
2
1