RSpecでログイン状態にする方法

やりたいこと

rspecでログイン状態のヘッダー内容をテストしたい

RSpec.describe '共通系', type: :system do
  let(:user) { create(:user) }

  describe 'ヘッダーの表示' do
    context 'ログイン前' do
      before { visit root_path }
      describe 'ヘッダー' do
        it 'ヘッダーが正しく表示されていること' do
          expect(page).to have_content('ログイン'), 'ヘッダーに「ログイン」というテキストが表示されていません'
        end
      end
    end

    context 'ログイン後' do
    end


調査

他の人のgithubを参照した所

spec/rails_helper.rb

  # FactoryBotの省略
  config.include FactoryBot::Syntax::Methods
  # ログインモジュール
  config.include LoginModule

ログインモジュールをつけると実装できそう


実装

visit login_path
fill_in 'Email', with: user.email
fill_in 'Password', with: 'password'
click_button 'Login'

これでログイン状態を実装することができるが、各ファイルでいちいち書くのは面倒なのでメソッドにしてModuleへ切り出してrails_helper.rbでincludeします

spec/support/login_module.rb

module LoginModule
  def login(user)
    visit login_path
    fill_in 'email', with: user.email
    fill_in 'password', with: 'password'
    click_button 'ログイン'
  end
end

rails_helper.rb

  # FactoryBotの省略
  config.include FactoryBot::Syntax::Methods
  # ログインモジュール
  config.include LoginModule

これでlogin(user)でログイン状態を再現できるようになります。


参考

qiita.com