Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RSpec set session object

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.

like image 838
parov Avatar asked Mar 17 '14 10:03

parov


2 Answers

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.

like image 36
HParker Avatar answered Oct 06 '22 03:10

HParker


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.

like image 98
zetetic Avatar answered Oct 06 '22 05:10

zetetic