rails+factorybot+deviseでログイン状態のテスト

目次

マーケター、エンジニアを月1時間からジョインできるプラットフォーム

airteamは月1時間からマーケターやエンジニアに相談できるプラットフォーム。 雇うのはハードル高いけどプロをチームに入れたい。そんな経営者のためのサービスです。 相談にのる方も募集しています。

タスクなしだから月一時間からジョイン可能

作業はなくオンライン相談メイン。 月1時間からさっと経験者に継続的に相談できます。

多様な経験者を雇用するより何倍も早くチームに

あらゆるジャンルの経験者がいるので あなたのチームのノウハウの選択肢が広がります。

NDAはすでに締結済み、契約もスムーズ

契約の煩雑なやりとりはなく、NDAはすでに締結済み、書面のやりとりはありません。

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で指定。