🙄

Rails|RSPECテストを作成する

2023/09/19に公開

今回、初めてRSPECテストを作成しました。

開発環境

ruby 3.1.2p20
Rails 6.1.7.4
Cloud9

テスト内容

・確認事項
 ゲストログイン機能が正しく動作するかどうか。

・モデル、コントローラ
 Userモデル
 deviseの public/sessionsコントローラ

RSPECテストを行うための準備

1. RSpecのジェムをインストール

Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 5.0'
  gem 'factory_bot_rails'
  gem 'shoulda-matchers'
end
ターミナル
$ bundle install
$ rails generate rspec:install

2. Deviseのテストヘルパーを読み込む

spec/rails_helper.rb
RSpec.configure do |config|
  # (他の設定)

  # Deviseのテストヘルパーを追加
  config.include Devise::Test::ControllerHelpers, type: :controller
end

3. Factory Botを使用してテストデータを作成

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    email { "test@example.com" }
    password { "password123" }
    name { "テストユーザ" }
    country_code { "JP" }
  end
end

4. shoulda-matchers の設定

spec/rails_helper.rb
## 最下部に追記
Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end

RSPECテストの作成

spec/controllers/public/sessions_controller_spec.rb

require 'rails_helper'
## rails_helper.rbの読み込み

RSpec.describe Public::SessionsController,"ログインに関するテスト", type: :controller do 

  before do 
    @request.env["devise.mapping"] = Devise.mapping[:user]
  end 
  
  describe "ゲストログイン" do
    subject { post :guest_sign_in }
    
    context "ゲストが存在しない場合" do 
      it "ゲストの作成" do 
        expect { subject }.to change(User, :count).by(1)
      end
      
      it "ゲストとしてログイン" do 
        subject 
	expect(controller.current_user.email).to eq('guest@example.com')
      end
      
      it "ルートパスへリダイレクト" do 
        subject
	expect(response).to redirect_to(root_path)
      end 
      
      it "フラッシュメッセージの表示" do
        subject
	expect(flash[:notice]).to eq("ゲストユーザーとしてログインしました。")
      end                 
    end 
    
    context "ゲストがすでに存在する場合" do
      let!(:guest_user) {User.guest}
      
      it "新たにゲストを作成しない" do 
        expect { subject }.not_to change(User, :count)
      end 
      
      it "存在するゲストでログインする" do 
        subject
	expect(controller.current_user.id).to eq(guest_user.id)
      end 
      
      it "ルートパスへリダイレクトする" do 
        subject
	expect(response).to redirect_to(root_path)
      end
      
      it "フラッシュメッセージを表示する" do 
        subject
	expect(flash[:notice]).to eq("ゲストユーザーとしてログインしました。")
      end      
    end
    
  end 
end 

以下のコマンドを実行すると、テスト結果がログに記述される。

ターミナル
$ rspec spec/controllers/public/sessions_controller_spec.rb

Discussion