2016-10-05 2 views
0

제 질문은 실패한 테스트가 아닙니다. 지금까지 모든 테스트가 통과되었습니다. 코드 예제는 Michael Hartl의 저서에 실렸습니다 (아마 이미 추측했을 것입니다). 나는이 시험을보고 :테스트 "current_user는 다이제스트 기억이 틀리면 nil을 반환합니다"

test "current_user returns nil when remember digest is wrong" do 
    @user.update_attribute(:remember_digest, User.digest(User.new_token)) 
    assert_nil current_user 
end 

내 질문은 간단 : 나를 설명, 왜 잘못 여기에 remember_digest 제발? 무엇이 잘못 될 수 있습니까? 당신의 자세한 내용

이 파일이 test/helpers/sessions_helper_test.rb이며,이 방법으로 시작 :

def setup 
    @user = users(:michael) 
    remember(@user) 
    end 

users(:michael)는 당신이 바로 그것을 가지고 test/fixtures/users.yml

+0

아마도'remember (@user)''메소드는 이미 쿠키에'''remember_digest''와''remember_token''을 만들었습니다. ''remember_digest'''가 새로운 정보로 갱신되면 더 이상''remember_token'''과 일치하지 않습니다. 그냥 추측하십시오. 나는 아직도 매우 혼란 스럽다. 나는 초보자이지만 여전히 많은 것을 이해해야한다 ;-) –

답변

1

파일에 정의되어있다 -이 시험은 확인하십시오 current_user한다 remember_digest이 잘못된 경우 nil이며 이는 쿠키가 예상과 다른 경우 사용자가 로그인하지 않았 음을 의미합니다. 의 다이제스트 기억 사용자가 정확하게 기억 토큰 함으로써 인증 시험을 대응하지 않는 경우 현재 사용자가 전무 것을 확인 우리가 두 번째 테스트를 추가 한

참고? 중첩 된 if 문에서 표현 :

def setup 
    @user = users(:michael) 
    remember(@user) 
end 

을하고 remember 기능은 사용자의 remember_digestremember_token에서 설정하여 설정합니다

if user && user.authenticated?(cookies[:remember_token]) 

Chapter 9

setup 테스트 전에 실행됩니다 쿠키 :

# Remembers a user in a persistent session. 
def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
end 
시험은 다음 대체

사용자의 remember_digest 임의의 값의 다이제스트와, 따라서 쿠키 무효화 :.

@user.update_attribute(:remember_digest, User.digest(User.new_token)) 

그래서 current_user 더 사용자가 로그인하지 않음을 의미하는 nil입니다

0

다음을 확인하십시오 :

def current_user 
     if (user_id = session[:user_id]) # i.e., if the user is logged in (has a session w/ user's id) 
      @current_user ||= User.find_by(id: user_id) 
     elsif (user_id = cookies.signed[:user_id]) 
      user = User.find_by(id: user_id) 
      if user && user.authenticated?(cookies[:remember_token]) 
       log_in user 
       @current_user = user 
      end 
     end 
    end 

(sessions_helper.rb에서) - 특히 stateme NT :

if user && user.authenticated?(cookies[:remember_token]) 

공지 사항, user.authenticated?(cookies[:remember_token]) 다음 @current_user 변수 인스턴스를 실패하면 무엇이든지 할당되지 않습니다. 이 경우 @current_user의 값은 0이됩니다.

>> user = User.create(name: "Michael", email: "[email protected]", password: "foobar", password_confirmation: "foobar") 
>> user.remember_token 
=> nil 
>> user.remember 
>> user.remember_token 
=> "68ObMQCCdjURdwH0QVEL7w" 
>> token = user.remember_token 
>> user.authenticated?(token) 
=> true 
>> user.update_attribute(:remember_digest, User.digest(User.new_token)) 
>> user.authenticated?(token) 
=> false 

가 마지막 줄 => true하려면 :

레일 콘솔에서, 시도, 더 나은 아이디어를 얻으려면

>> user.remember 
>> new_token = user.remember_token 
>> user.authenticated?(new_token) 
=> true 

이제 remember 방법부터 다시 session_helper_test.rb에서 찾고 설정에서 호출되었지만 테스트 블록에서 @user.update_attribute(:remember_digest, User.digest(User.new_token)) 이후가 아닌 경우 user.authenticated?(user.remember_token)이 실패 할 것으로 예상 할 수 있습니다. 따라서 if user && user.authenticated?(cookies[:remember_token]) 문은 false이됩니다. 따라서 @current_user은 절대로 값이 주어지지 않으므로 nil이됩니다.

관련 문제