2014-07-21 108 views
2

我試圖visit '/requests/new。現在在控制器代碼中,我寫了它,以便如果會話不存在,用戶將重定向回主頁。像這樣:Rspec /水豚模擬會話(存根或模擬?)

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

用戶如何獲得一個會話?這就是你如何做到的 - 你不會殘缺或嘲笑它。 – sevenseacat

+0

用戶通過放入他/她的電子郵件來獲得會話,然後'session [:signup_email]'跟隨他們。是的,我知道我可以編寫測試來模仿這種實際行爲,但是當我必須編寫數百個測試時,我寧願看看是否有辦法說出會話應該是什麼,而不是訪問該頁面,填寫電子郵件,單擊按鈕等 – james

回答

1

你可以試試這個寶石rack_session_access

然後你可以在水豚

+0

沒有工作恐怕... – james

+0

我檢查了源代碼,基本上它會暴露一個端點,用於設置會話,我想它會工作。 – allenwei

0

調用page.set_rack_session(:user_id => user.id)至於我自己,我發現這兩個解決方案:

  1. https://stackoverflow.com/a/5803121/3797480
  2. https://stackoverflow.com/a/8726895/3797480

當您測試系統組件的集成時,第一個解決方案(不是存根驗證過程)似乎在集成(和請求)規範中更合理。所以我不會傷害認證感受,它也是一個組件。

+0

雖然我沒有認證,只是一個會話存儲。在這兩種情況下,都不適合我... – james

0

you can try this gem rack_session_access Then you can call page.set_rack_session(:user_id => user.id) in Capybara

使用allenwei解決方案,不要忘了添加以下要求對rails_helper(軌道4+)/ spec_helper(軌3+):

require "rack_session_access/capybara"

+0

哦,剛纔在這裏看到了...... 不要忘了將'config.middleware.use RackSessionAccess :: Middleware'添加到** environment/test.rb * * –