2016-10-05 7 views
0

私の質問は失敗したテストではありません。今まではすべてのテストがパスしています。 コード例は、Michael Hartlの本にあります(おそらく既にそれを推測していたでしょう)。 私はこのテストを見て:test "ダイジェストが間違っていると、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となります。これは、Cookieが予想外の場合にログインしていないことを意味します。ダイジェストを覚えて、ユーザの記憶が正しけれトークンへ 、それによって認証されたテストに対応していない場合は、現在の ユーザーが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の値はゼロになります。

しようと、レールコンソールで、より良いアイデアを得るために:

>> 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になります。

関連する問題