🙄
Rails|RSPECテストを作成する
今回、初めて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