RSpec set session object RSpec set session object ruby-on-rails ruby-on-rails

RSpec set session object


This is explained in the Guide to Testing Rails Applications in section 4 "Functional Tests for your Controllers. The get action takes a params hash and a session hash, e.g.:

get(:show, {'id' => "12"}, {'user_id' => 5})

You should be able to pass in nil for the params hash in your example, then pass in your desired session parameters:

get :index, nil, {coupon: 'abcd'}

I recommend a thorough reading of the Rails guide for anyone using RSpec for Rails testing. rspec-rails leverages the existing Rails test classes, a point which is not made very clear in the rspec-rails docs.


In Rails 5+, if you are using ActionController::TestCase session is passed as a keyword arg.

Setting params and session would look like:

get(:show, params: {'id' => "12"}, session: {'user_id' => 5})

Setting only the session would look like,

get(:show, session: {'user_id' => 5})

If you are using ActionDispatch::IntegrationTest, which is the new default for for controller tests, you are not able to set the session variables and should set them by walking your test through the login flow.


You can also use @request object like

@request.session['coupon'] = 'abcd'