【问题标题】:Rails 5 Rspec set session variableRails 5 Rspec设置会话变量
【发布时间】:2018-01-14 04:35:44
【问题描述】:

我有一个测试 POST 请求的请求测试规范。

在我的 PaymentController(处理 POST 请求)中,我有

before_action :require_user, :require_order

这基本上是根据会话获取用户和订单。

知道如何在我的请求测试规范中设置会话变量(user_id 和 order_id)吗?

【问题讨论】:

  • 请移除 Capybara 标签。 Capybara 不用于请求规范。
  • 你不能在before(:each) 块中执行类似request.session[:user_id] = 1 的操作吗?
  • 设法找到答案?

标签: ruby-on-rails rspec ruby-on-rails-5


【解决方案1】:

从 Rails 5.0 开始,最好的方法是在控制器/请求测试中使用关键字参数:

get :index, params: { ... }, session: { user_id: 1, ... }

如果您使用的是 Devise、Clearance 等身份验证库,则有各种帮助程序来存根登录用户,请参阅此处的 Devise 文档:

before(:each) do
  # or def setup if using minitest
  @request.env["devise.mapping"] = Devise.mappings[:user]
  sign_in User.create(...)
end

【讨论】:

  • @Linus 应该是相同的,因为 Ruby 将所有哈希参数合并到一个哈希中。
【解决方案2】:

对于 Rails

def _set_session(key, value)
  Warden.on_next_request do |proxy|
    proxy.raw_session[key] = value
  end
end

_set_session(:access_acount_id, user.id)

示例

def _set_session(key, value)
  Warden.on_next_request do |proxy|
    proxy.raw_session[key] = value
  end
end

context 'When there is something' do
  let(:yesterday) { 1.day.ago }
  let(:updates_enabled) { true }

  before do
    _set_session(:access_acount_id, user.id)
    login_as(user, scope: :user)
  end

  it 'does not update records' do
    visit dashboard_path
    expect(page).to have_css('.popup#my-popup')
  end
end

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2012-08-16
    • 2012-02-05
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多