2014-01-29 61 views
2

在我的Rails應用程序中,我使用Devise進行用戶身份驗證。 當用戶登錄到應用程序時,Devise會對該用戶進行身份驗證併爲該特定用戶創建會話。Devise + RSpec + Capybara:測試用戶登錄時成功創建的新會話

我需要測試一下,當用戶登錄時,會爲該用戶創建一個會話。我怎麼做?

在我的驗收測試,如果我這樣做,

feature 'User logs in' do 
     scenario 'with valid email and password' do 
     log_in_with '[email protected]', 'password' 

     expect(page).to have_content('Log out') 
     end 

     def log_in_with(email, password) 
     visit new_user_session_path 
     fill_in 'Email', with: email 
     fill_in 'Password', with: password 
     click_button 'Log in' 
     end 
    end 

不過我沒有檢查新的會話是爲登錄的用戶創建的。這不符合我的要求,因爲我沒有檢查是否創建了實際的用戶會話。

現在,如果我使用warden代替:

user = FactoryGirl.create(:user) 
    login_as(user, :scope => :user) 
    ... 

我只是說,登錄爲某某用戶進入下一步驟如可能查了註銷鏈接或編輯個人資料的鏈接,但不檢查用戶的會話創建。

如果我這樣做在控制器的規格,在那裏我有機會獲得sign_insign_out方法:

describe Devise::SessionsController do 

     it "user signed in successfully" do 
     logged_user = User.create(:email => "[email protected]", :password => "12345678") 

     sign_in logged_user 

     expect(controller.user_session).not_to be nil 

     end 
    end 

在這裏,我有機會獲得user_sessioncurrent_useruser_signed_in?方法。 在這3種選擇中,我選擇了user_session,因爲它似乎與當前用戶會話相關聯。 這是正確的方法嗎? 或者是否有其他替代方法或直接方法可用於檢查會話是處於活動狀態還是爲用戶創建的? 有沒有辦法在我的驗收測試中檢查這個場景?

回答

1

我敢肯定,您可以使用Controller規範中的會話哈希訪問所有會話數據。你可以使用它,比方說,檢查是否USER_ID會話密鑰已在簽名後置:

expect(session[:user_id]).to_not be_nil

和當然,你可以用它來檢查你可能會增加整個任何會話您應用。

如果你真的希望看到通過制定創建的會話,你可以訪問會話生成的監獄長鍵:

expect(session["warden.user.user.key"][0].first).to eql logged_user.id

這是一種不必要的,因爲這是什麼樣的東西是已經在設計中進行了測試,所以只要用戶登錄就測試就足夠了。

關於測試Omniauth控制器還有一個很好的post,這也是測試SessionsController的一個很好的指南。它使用舊的應該RSpec的語法,但它應該是可以理解的= P

相關問題