RSpec设置会话对象

时间:2014-03-17 10:30:52

标签: ruby-on-rails session object rspec

我正在尝试从我的控制器规范中设置会话对象。

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

但是当我检查会话而不是@coupon对象时,我得到一个包含字符串'coupon'的@data,并且测试失败。

4 个答案:

答案 0 :(得分:52)

第4节"控制器的功能测试中的Guide to Testing Rails Applications对此进行了解释。 get操作采用params hash 会话哈希,例如:

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

您应该能够在示例中为nil传递params哈希,然后传入您想要的会话参数:

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

对于使用RSpec for Rails测试的任何人,我建议您仔细阅读Rails指南。 rspec-rails利用现有的Rails测试类,这一点在rspec-rails文档中没有明确说明。

答案 1 :(得分:36)

在Rails 5+中,如果您使用的是ActionController::TestCase会话,则会将其作为关键字arg传递。

设置参数和会话看起来像:

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

仅设置会话,

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

如果您正在使用ActionDispatch::IntegrationTest,这是控制器测试的新默认值,那么 能够设置会话变量,并应通过登录测试来设置它们流动。

答案 2 :(得分:15)

您也可以使用@request对象

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

答案 3 :(得分:0)

您也可以这样做:

request_params = { city: 'Bomet', code: '023' }
session_params = { taxes_paid: 'No' }

然后您可以按照自己的规范进行操作:

get :edit, request_params, session_params

在功能上,您可以使用session[:taxes_paid]

访问会话