我正在尝试从我的控制器规范中设置会话对象。
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节“控制器的功能测试”中的Guide to Testing Rails Applications中进行了解释.get
动作采用params散列和会话散列,例如:
get(:show, {'id' => "12"}, {'user_id' => 5})
您应该能够在示例中传递nil
for params hash,然后传入您想要的会话参数:
get :index, nil, {coupon: 'abcd'}
对于使用RSpec for Rails测试的任何人,我建议您仔细阅读Rails指南。 rspec-rails
利用现有的Rails测试类,这一点在rspec-rails
文档中没有明确说明。
在Rails 5+中,如果您使用的是ActionController::TestCase
会话,则将其作为关键字arg传递。
设置参数和会话看起来像:
get(:show, params: {'id' => "12"}, session: {'user_id' => 5})
仅设置会话看起来像,
get(:show, session: {'user_id' => 5})
如果您使用ActionDispatch::IntegrationTest
(这是控制器测试的新默认值),则无法设置会话变量,应通过在登录流程中测试来设置它们。
您也可以使用@request对象
@request.session['coupon'] = 'abcd'
你也可以这样做:
request_params = { city: 'Bomet', code: '023' }
session_params = { taxes_paid: 'No' }
然后在您的规范中,您可以:
get :edit, request_params, session_params
在您的功能中,您可以使用session[:taxes_paid]
访问您的会话