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节“控制器的function测试”中的“测试Rails应用程序指南”对此进行了解释.get操作采用params散列会话散列,例如:

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

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

 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'