Techioz Blog

rspec テスト用に Rails セッション データを変更する

概要

私は Ruby on Rails アプリケーションの rspec を書いており、認証に Google を使用しています。認証を追加する前に仕様はすべて正常に設定されていましたが、認証されたユーザーをテストする何らかの方法が必要になりました。私の仕様の1つは次のようになります。

require 'rails_helper'

RSpec.describe 'Test', type: :request do
  it 'should return 200' do
    get '/test'
    expect(response).to have_http_status(:ok)
  end
end

これは、当然のことながら 401 では失敗します。

コントローラーがユーザーがログインしていることを認識できるように、セッション変数に認証情報を追加する必要がありますが、rspec からセッション変数を変更する方法はないようです。テスト用の Google アカウントを作成し、実際の Google アカウントにログインするためのヘルパーをセットアップすることはできると思いますが、テストを作成するより良い方法があるはずです。オンラインでいくつかの例を見てきましたが、ほとんどは古いバージョンの Rails 用のようです。

私は Rails 7.0.4.3 と Ruby 3.2.2 を使用しています。

編集: おそらく認証コードを含めるべきだと思いました。

class ApplicationController < ActionController::Base
  before_action :require_auth

  private

  def require_auth
    user_id = session[:user_id]

    if !user_id.present?
      head :unauthorized
    else
      @auth_user = User.find(user_id)

      if !@auth_user.present?
        head :unauthorized
      end
    end
  end
end

解決策

私の知る限り、rack_session_access gem または同様のソリューションを追加しない限り、RSpec リクエストスペックのテストセットアップでセッション変数を簡単に変更する方法はありません。

1 つのアプローチは、ログイン ユーザーを必要とするテストで auth_user オブジェクトを模擬することです。

class ApplicationController < ActionController::Base
  before_action :require_auth

  private

  def auth_user
    @auth_user ||= User.find_by(id: session[:user_id])
  end

  def require_auth
    head(:unauthorized) unless auth_user.present?
  end
end

# spec/support/test_macros.rb
module TestMacros
  def log_in(user)
    allow_any_instance_of(ApplicationController).to receive(:auth_user).and_return(user)
  end
end

# spec/rails_helper.rb
RSpec.configure do |config|
  config.include(TestMacros)
end

it 'should return 200' do
  user = # create or fabricate user
  log_in(user)
  get '/test'
  expect(response).to have_http_status(:ok)
end