RSpec设置会话对象

par*_*rov 32 session rspec ruby-on-rails object

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

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
Run Code Online (Sandbox Code Playgroud)

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

zet*_*tic 55

第4节"控制器的功能测试" 中的"测试Rails应用程序指南"对此进行了解释.该get操作采用params散列会话散列,例如:

get(:show, {'id' => "12"}, {'user_id' => 5})
Run Code Online (Sandbox Code Playgroud)

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

get :index, nil, {coupon: 'abcd'}
Run Code Online (Sandbox Code Playgroud)

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


HPa*_*ker 42

在Rails 5+中,如果使用ActionController::TestCasesession ,则将其作为关键字arg传递.

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

get(:show, params: {'id' => "12"}, session: {'user_id' => 5})
Run Code Online (Sandbox Code Playgroud)

仅设置会话看起来像,

get(:show, session: {'user_id' => 5})
Run Code Online (Sandbox Code Playgroud)

如果您正在使用ActionDispatch::IntegrationTest(这是控制器测试的新默认值),则无法设置会话变量,应通过在登录流程中执行测试来设置它们.

  • 看起来这只适用于ActionController :: TestCase,它不再是控制器规范的默认父类.默认现在是ActionDispatch :: IntegrationTest,它不公开设置会话变量的方法,[DHH建议发出实际请求来模仿使用界面登录](https://github.com/rails/rails/issues/23386#issuecomment-178013357),(按照集成测试的惯例). (4认同)

Vig*_*vel 15

您也可以使用@request对象

@request.session['coupon'] = 'abcd'
Run Code Online (Sandbox Code Playgroud)

  • 不在提出要求之前 (2认同)