2014-12-27 167 views
1

我正在通过Michael Hartl的Rails Tutorial进行工作,我目前在第8.5章的第8章。我试图通过该测试来发现我收到的失败,但我无法弄清楚在哪里解决。如何解决此错误?

FAIL["test_current_user_returns_right_user_when_session_is_nil", SessionsHelperTest, 0.05582] test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (0.06s) 
    --- expected 
    +++ actual 
    @@ -1 +1 @@ 
    -#<User id: 584273342, name: "Kyle Example", email: "[email protected]", created_at:    "2014-12-27 20:09:35", updated_at: "2014-12-27 20:09:35", password_digest: "$2a$04$yK7dSRppfGCqCbrXXZ34meDB2jEulxy9BDVNH32qLDz...", remember_digest: "$2a$04$GT65nJ.fE90LasXpaT1HruCChf.hl.4fvMrtx2iV48V..."> 
    +nil 
    test/helpers/sessions_helper_test.rb:11:in `block in <class:SessionsHelperTest>' 

我的测试代码使用下面的代码。

require 'test_helper' 

class SessionsHelperTest < ActionView::TestCase 

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

    test "current_user returns right user when session is nil" do 
    assert_equal @user, current_user 
    assert is_logged_in? 
    end 

    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 
end 

SessionsHelper模块

module SessionsHelper 

    # Logs in the given user. 
    def log_in(user) 
    session[:user_id] = user.id 
    end 

    #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 

    #Returns the user corresponding to the remember token cookie. 
    def current_user 
    if (user_id = session[:user_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 

    #Returns the current logged-in user (if any). 
    def current_user 
    @current_user ||= User.find_by(id: session[:user_id]) 
    end 

    #Returns true if the user is logged in, false otherwise. 
    def logged_in? 
    !current_user.nil? 
    end 

    def log_out 
    session.delete(:user_id) 
    @current_user = nil 
    end 

    # Forgets a persistent session. 
    def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

    # Logs out the current user. 
    def log_out 
    forget(current_user) 
    session.delete(:user_id) 
    @current_user = nil 
    end 
end 

用户模式

class User < ActiveRecord::Base 
    attr_accessor :remember_token 
    before_save { email.downcase! } 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, 
    format: { with: VALID_EMAIL_REGEX }, 
    uniqueness: { case_sensitive: false } 
    has_secure_password 
    validates :password, length: { minimum: 6 } 

    # Returns the hash digest of the given string. 
    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
     BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    #Returns a random token. 
    def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

    #Remembers a user in the database for use in persistent sessions 
    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
    end 

    #Returns true if the given token matches the digest. 
    def authenticated?(remember_token) 
    return false if remember_digest.nil? 
    BCrypt::Password.new(remember.digest).is_password?(remember_token) 
    end 

    # Forgets a user. 
    def forget 
    update_attribute(:remember_digest, nil) 
    end 
end 

上什么可能导致此任何想法?

回答

5

你有module SessionsHelper

2种

def current_user

方法除去这一个(这是旧的和不检查cookies存在):

#Returns the current logged-in user (if any). 
def current_user 
    @current_user ||= User.find_by(id: session[:user_id]) 
end 

是目前正在用于您的测试,因为它定义在下面的更新版本中。

+0

谢谢你解决了失败!现在我还有一些其他错误,我会花一些时间来解决问题并进行排除。 – Kozmo101 2014-12-27 21:01:48