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