【问题标题】:RSpec set session objectRSpec 设置会话对象
【发布时间】:2014-04-22 12:24:10
【问题描述】:

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

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,并且测试失败了。

【问题讨论】:

  • validate_coupon 是做什么的?你不是说要-Service.any_instance.stub(:validate_coupon).with(:coupon).and_return('abcd')吗?事实上,它实际上是Service.any_instance.stub(:validate_coupon).with('abcd').and_return('abcd'),因为session[:coupon]'abcd'...

标签: ruby-on-rails session object rspec


【解决方案1】:

这在Guide to Testing Rails Applications 第 4 节“控制器的功能测试”中进行了解释。get 操作采用参数散列会话散列,例如:

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

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

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

我建议任何使用 RSpec 进行 Rails 测试的人通读 Rails 指南。 rspec-rails 利用现有的 Rails 测试类,rspec-rails 文档中没有明确说明这一点。

【讨论】:

  • 你完全正确!我跳过了 Rails 指南中的一些部分。你知道建议的方法和明确地为会话分配一些值(如 session[:coupon]='abcd')之间的区别吗?只是因为有时似乎也有效。
【解决方案2】:

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

设置参数和会话如下所示:

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

只设置会话看起来像,

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

如果您使用ActionDispatch::IntegrationTest,这是控制器测试的新默认值,您无法设置会话变量,应通过登录流程遍历测试来设置它们。

【讨论】:

  • 感谢@HParker 的提示;)
  • 看起来这只适用于 ActionController::TestCase,它不再是控制器规范的默认父类。现在默认是 ActionDispatch::IntegrationTest,它不公开设置会话变量的方法,以及 DHH recommends making an actual request to imitate logging in with the interface,(作为集成测试的约定)。
  • 谢谢@mltsy!我更新了答案以包含有关您的基类何时为ActionDispatch::IntegrationTest 的信息。如果我的任何细节有误,请告诉我。
【解决方案3】:

你也可以使用@request 对象

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

【讨论】:

  • 很高兴它很有用! @Haider
  • 不是在请求发出之前
【解决方案4】:

你也可以这样做:

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

然后在你的规范中你可以这样做:

get :edit, params: request_params, session: session_params

在您的功能中,您可以使用session[:taxes_paid] 访问您的会话

【讨论】:

  • get :edit, request_params, session_params 行引发以下错误:wrong number of arguments (given 2, expected 1) 使用 Rails 6 和 rspec 3.9。
  • 更新了获取参数和会话密钥的答案
猜你喜欢
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多