railsのテストでログイン状態のテストをしたい際の実装をまとめました。factorybotなら簡単にログイン状態のテストをできますがdeviseのvalidationを通過するのに少し手間取りました。
ログイン状態にするために
Rspecでdeviseのメソッドが使えるようにする
spec/rails_helper.rb
config.include Devise::Test::IntegrationHelpers, type: :request
上記をspec/rails_helper.rbに記載してメソッドを使えるように。
テスト用データ作成
FactoryBot.define do
factory :user_01,class: User do
id { 1 }
email { "test_01@gmail.com" }
password { "asjdnqjwdnoqw" }
confirmation_token { "_wCQHqBrkthWiZ_FUznF" }
confirmed_at { Date.today }
confirmation_sent_at { Date.today }
name { "tarou" }
description { "taroudesu" }
agreement_terms { true }
end
end
dbのカラム上はencrypted_passwordで暗号化されているが、指定する際はpasswordで指定する。
sign_inメソッドでサインイン
require 'rails_helper'
RSpec.describe "message_controller", type: :request do
describe "ページ表示" do
before do
@user_01 = FactoryBot.create(:user_01)
sign_in @user_01
end
it "test" do
get '/users/admin/1'
expect(response).to have_http_status(200)
end
end
end
ログインしていないと表示できないページの表示テスト。createした後にsign_in @user_01でサインイン。
よくハマる落とし穴
よくハマる落とし穴は下記。
deviseのpassword
DBでencrypted_passwordと出ているのでencrypted_passwordで指定するとpasswordとして認識されない。passwordで指定。