2014-01-30 70 views
2

我想定製一段時間後,我的Rails應用程序將自動結束用戶的會話。測試使用RSpec設計會話超時時間

我發現this question給我正是我需要的,但我想通過TDD來解決這個問題。我已經爲應用程序提供了一個相對穩定的測試套件,但在測試用戶會話是否已過期時,我只是有點遺憾,除了在那裏進行測試並等待會話在x.minutes過期後終止。當然有更好的方法。

我檢查了設計和守望者文檔,以幫助處理這個問題的測試助手幹起來。任何人有任何提示?

+0

你並不需要測試設計功能,如超時,因爲它在設計已經測試過的。 – boblin

+0

你可以嘗試類似[timecop](https://github.com/travisjeffery/timecop)。這應該讓您在集成測試中啓動會話,然後快速轉發30分鐘並檢查它是否已過期。 –

+0

[設計可超時測試](https://github.com/plataformatec/devise/blob/master/test/integration/timeoutable_test.rb)可能有線索。看起來他們稱'get expire_user_path(user)'來模擬超時,但是在我的RSpec測試中會出現「未定義的方法」錯誤。 –

回答

2

如何將殘片user.timedout?返回true?或者,您可以在測試中傳遞超出自定義超時值的自定義時間,如user.timed_out?(31.minutes.ago)

0

默認情況下,設備設置超時時間爲30分鐘。 你可以使用user.timedout?([specify time in past])

例如:

user.timedout?(30.minutes.ago)將返回false

user.timedout?(10.minutes.ago)將返回true

,您可以檢查裏面的RSpec user.timedout?()值。

0

,而不是與確切時間打經過:

由於設計是建立在監獄長,你可以模擬設計:: SessionsController已超時由監獄長::測試::傭工方式的用戶,要授予訪問權限Rack代理。


# settings_page_spec.rb 

include Warden::Test::Helpers 

it 'does not allow updating password after timed out' do 
    expect(current_path).to eq(user_settings_path(user)) 
    clink_link 'Manage Password' 
    expect(page).to have_button('Update Password') 
    Warden.on_next_request do |proxy| 
     proxy.set_user(nil) 
     click_button 'Update Password' 
     expect(current_path).to eq(login_path) 
    end 
end 

完全此處的博客文章:http://www.morphogenic.net/2016/10/devise-test-timeout-user-in-featureintegration-specs-using-warden/