Rspec / Capybara模拟会话(存根或模拟?)

时间:2014-07-21 03:01:41

标签: ruby-on-rails session rspec capybara session-variables

我试图visit '/requests/new。现在在控制器代码中,我已经编写了它,这样如果会话不存在,用户将被重定向回主页。像这样:

def new
@pagetitle = "What would you like to borrow?"

if session[:signup_email].nil?
  flash[:danger] = "Please enter your email to get started"
  redirect_to root_path
else
  @signup_parent = Signup.find_by_email(session[:signup_email].downcase)
  if @signup_parent.tos != true || @signup_parent.streetone.blank? || @signup_parent.streettwo.blank? || @signup_parent.zipcode.blank?
    flash[:danger] = "Almost there! We just need a little more info"
    redirect_to edit_signup_path
  else
    @requestrecord = @signup_parent.requests.build 
  end
end

但问题是,现在在测试中,我无法模拟会话。我试着写:

    before do
        session[:signup_email] = Signup.find_by_id(@signup_ana.id)
        visit '/requests/new'
        save_and_open_page
        fill_in '#borrow__1', :with => 1
        click_button
    end

但是这引发了一个错误:undefined local variable or method会话'对于#`

然而,如果我不尝试模拟它,save_and_open_page告诉我,我只是被重新路由回家。我该怎么做?有没有办法存根/嘲笑这个?

3 个答案:

答案 0 :(得分:1)

你可以尝试这个宝石rack_session_access

然后你可以在Capybara打电话给page.set_rack_session(:user_id => user.id)

答案 1 :(得分:0)

对于我自己,我找到了这两个解决方案:

  1. https://stackoverflow.com/a/5803121/3797480
  2. https://stackoverflow.com/a/8726895/3797480
  3. 在测试系统组件的集成时,第一个解决方案,而不是存根认证过程,似乎在集成(和请求)规范中更合理。所以我不会伤害认证感受,它也是一个组成部分。

答案 2 :(得分:0)

  

你可以尝试这个gem rack_session_access   然后你可以在Capybara中调用page.set_rack_session(:user_id => user.id)

使用allenwei解决方案,不要忘记在rails_helper(rails 4+)/ spec_helper(rails 3 +)上添加以下要求:

require "rack_session_access/capybara"