0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】RSpecを使用したコントローラーの単体テスト

Last updated at Posted at 2025-05-15

記事概要

Ruby on Railsのコントローラー単体テストについて、まとめる

前提

  • Ruby on Railsでアプリケーションを作成している
  • アプリにRSpecをインストールしている
  • RSpecの設定が完了している

RSpecとは

コントローラーテストコードを書く方針

あるアクションにリクエストを送ったとき、想定通りのレスポンスが生成されるかどうかを確かめる

Request Spec

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

手順(Request Specのインストール)

  1. RSpecをインストールする
    詳細は、こちらを参照

手順(テストファイル作成)

  1. モデルのテストファイルを生成するため、下記コマンドを実行する
    # アプリのディレクトリに移動
    % cd ~/[アプリ名]
    
    % rails g rspec:request [コントローラー名]
    
  2. spec/requests/[コントローラー名]_spec.rbが作成されたことを確認する

手順(テストケースの記述)

  1. [コントローラー名]_spec.rbにテストケースを記述する
    1. 機能別・条件別・テスト詳細別にグループ分けを行う
    2. 保存するデータ(インスタンス)を作成する
    3. テストコードを記述する
      ※各テストコードが想定通りに実行できるかを確認するため、rails cコマンドでコンソールを起動して確認を行う

手順(テストファイルの実行)

  1. テストファイルを実行するため、下記コマンドを実行する
    # アプリのディレクトリに移動
    % cd ~/[アプリ名]
    
    % bundle exec rspec spec/requests/コントローラー名_spec.rb
    
  2. ターミナル.appで正常完了していることを確認する
    結果が緑色で表示されれば実行成功

確認方法

レスポンスのステータス

コントローラーのアクションにリクエストすると、レスポンスが返ってくるかを確認する

  1. rails routesコマンドで、ルーティングパスを確認する
  2. テストファイルに、get [Prefix]_pathbinding.pryを記載する
    コントローラー名_spec.rb
    it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 
      get root_path
      binding.pry
    end
    
  3. テストファイルを実行する
  4. コンソールに、response.statusと入力する
  5. HTTPステータスコードが表示される
  6. HTTPステータスコードを確認し、テストコードを記述する
    コントローラー名_spec.rb
    # ステータスコード=200(正常)のケース
    it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 
      get root_path
      expect(response.status).to eq 200
    end
    
  7. テストファイルを実行する

レスポンスに含まれる、保存済みのDBデータ

保存済みのDBデータがレスポンスに含まれることを確認する

  1. rails routesコマンドで、ルーティングパスを確認する
  2. テストファイルに、get [Prefix]_pathbinding.pryを記載する
    コントローラー名_spec.rb
    it 'indexアクションにリクエストすると正常にレスポンスが返ってくる' do 
      get root_path
      binding.pry
    end
    
  3. テストファイルを実行する
  4. コンソールに、response.bodyと入力する
  5. HTMLの情報が表示される
  6. 保存済みのDBデータが含まれているか確認するテストコードを記述する
    コントローラー名_spec.rb
    # @tweet.textの情報が含まれているかを確認するケース
    it 'indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する' do
      get root_path
      expect(response.body).to include(@tweet.text)
    end
    
  7. テストファイルを実行する

レスポンスに含まれる、HTMLの文字

HTMLのタグでブラウザ表示している文字がレスポンスに含まれることを確認する

  1. get [Prefix]_pathexpectationを記載する
    コントローラー名_spec.rb
    it 'indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する' do 
      get root_path
      expect(response.body).to include('投稿を検索する')
    end
    
  2. テストファイルを実行する

参考コード

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まとめ

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?