我试图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
告诉我,我只是被重新路由回家。我该怎么做?有没有办法存根/嘲笑这个?
答案 0 :(得分:1)
你可以尝试这个宝石rack_session_access
然后你可以在Capybara打电话给page.set_rack_session(:user_id => user.id)
答案 1 :(得分:0)
对于我自己,我找到了这两个解决方案:
在测试系统组件的集成时,第一个解决方案,而不是存根认证过程,似乎在集成(和请求)规范中更合理。所以我不会伤害认证感受,它也是一个组成部分。
答案 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"