I'm trying to set a session object from my controller spec.
it 'use invalid coupon' do session[:coupon] = 'abcd' Service.any_instance.stub(:validate_coupon).with(session[:coupon]).and_return('abcd') get :index expect(flash[:coupon__notice]).to be nil end
but when I inspect the session, instead of a @coupon object, I get a @data that contains the string 'coupon', and test fails.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With