2014-01-30 3 views
2

레일스 앱이 자동으로 사용자 세션을 종료하는 기간을 사용자 정의하고 싶습니다.테스트 RSpec을 사용하여 세션 시간 초과 확인

나는 정확히 내가 원하는 것을 줄 수있는 this question을 찾았지만 TDD를 통해이 문제에 접근하고 싶습니다. 상대적으로 견고한 테스트 스위트가 있는데, 사용자 세션이 만료되었는지 여부를 테스트 할 때 약간의 손실이 발생합니다. 테스트가 끝나고 x.minutes 경과 후 세션이 만료 될 때까지 기다리는 것 이외에는 . 확실히 더 좋은 방법이 있습니다.

이 문제를 다루는 테스트 도우미에 대한 Devise and Warden 문서를 확인하고 건조했습니다. 누구든지 어떤 조언이 있으십니까?

+0

당신은 같은 시간 제한 등의 고안 기능을 테스트 할 필요가 없습니다. – boblin

+0

[timecop] (https://github.com/travisjeffery/timecop)과 같은 것을 시도해보십시오. 통합 테스트에서 세션을 시작한 다음 30 분 빨리 감기하고 만료되었는지 확인해야합니다. –

+0

[시간 제한 테스트 작성] (https://github.com/plataformatec/devise/blob/master/test/integration/timeoutable_test.rb)에는 단서가있을 수 있습니다. 그것은 그들이'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?(10.minutes.ago)가 반환됩니다

user.timedout?(30.minutes.ago)는 false를 돌려줍니다 사실

당신이 RSpec에 내부 user.timedout?() 값을 확인할 수 있습니다. 대신 정확한 시간에 재생

0

경과 :

고안이 소장에 내장되어 있기 때문에, 당신은 고안 :: SessionsController가 액세스 권한을 부여 소장 :: 시험 :: 도우미의 방법으로 사용자를 시간이 초과되었습니다 것을 시뮬레이션 할 수 있습니다 랙 프록시. 여기


# 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/