Rails 5 Rspec设置会话变量

时间:2018-01-14 04:35:45

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

我有一个请求测试规范,用于测试POST请求。

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

before_action :require_user, :require_order

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

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

2 个答案:

答案 0 :(得分:0)

从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

答案 1 :(得分:0)

对于Rails <5,此解决方案有效

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