44
27

More than 3 years have passed since last update.

RSpec RequestSpecでsessionを利用する

Last updated at Posted at 2020-05-27

Rspec request specでセッションの読み込み、書き込みを実現してみる

今回はActionDispatch::Requestのsessionメソッドを上書きする形で対応します

allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return({})

事前にセッションを書き込む方法

rails_helper.rb に上記のsessionメソッド上書きを実装します

rails_helper.rb

RSpec.configure do |config|
  # ...

  # テストケース共通の事前処理
  config.before(:each) do

    # let(:rspec_session) で指定された値を セッションの初期値とします
    session = defined?(rspec_session) ? rspec_session : {}

    # destroyメソッドを実行してもエラーにならないようにします(必要であれば)
    session.class_eval { def destroy; nil; end } 

    # sessionメソッドを上書き
    allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return(session)
  end
end

以下のように テストコード内の変数でセッションの初期値を設定できます

let(:rspec_session) { { user_id: 1 } }

事前にセッションを書き込む&実行後のセッションを取得する方法

config.add_setting() を使用し、session変数をグローバルで扱えるようにします

上記の rails_helper.rb に更に追記します

rails_helper.rb

RSpec.configure do |config|
  # ...

  # テストケース共通の事前処理
  config.before(:each) do

    # let(:rspec_session) で指定された値を セッションの初期値とします
    session = defined?(rspec_session) ? rspec_session : {}

    # destroyメソッドを実行してもエラーにならないようにします(必要であれば)
    session.class_eval { def destroy; nil; end }

    # 追記 実行後のセッションを取得できるようにする
    config.add_setting(:session, :default => session)

    # 変更 sessionメソッドをRSpec.configuration.sessionで上書き
    allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return(RSpec.configuration.session)
  end
end

テスト実施後に RSpec.configuration.session を取得することで、実行後のセッションを確認できます

expect(RSpec.configuration.session[:user_id]).to eq 1

参考にしました

Method: RSpec::Core::Configuration#add_setting

いいね!と思ったら LGTMお願いします👍

44
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
27