2015-10-17 78 views
0

我在第9章,似乎測試再次失敗。下面是相關代碼:更多Ruby on Rails測試問題

sessions_helper.rb:

module SessionsHelper 

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

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

    def current_user? 
    user == current_user 
    end 

    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 

    def logged_in? 
    !current_user.nil? 
    end 

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

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

這裏是users_edit_test.rb:

require 'test_helper' 

class UsersEditTest < ActionDispatch::IntegrationTest 
    # test "the truth" do 
    # assert true 
    # end 

    def setup 
    @user = users(:michael) 
    end 

    test "successful edit" do 
    log_in_as(@user) 
    get edit_user_path(@user) 
    assert_template 'users/edit' 
    name = "Foo Bar" 
    email = "[email protected]" 
    patch user_path(@user), user: { name: name, 
            email: email, 
            password: "", 
            password_confirmation: ""} 
    assert_not flash.empty? 
    assert_redirected_to @user 
    @user.reload 
    assert_equal name, @user.name 
    assert_equal email, @user.email 
    end 

    test "unsuccessful edit" do 
    log_in_as(@user) 
    get edit_user_path(@user) 
    assert_template 'users/edit' 
    patch user_path(@user), user: { name: "", 
            email: "[email protected]", 
            password: "foo", 
            password_confirmation: "bar"} 
    assert_template 'users/edit' 
    end 
end 

這裏是users_controller.rb:

class UsersController < ApplicationController 
    before_action :logged_in_user, only: [:edit, :update] 
    before_action :correct_user, only: [:edit, :update] 
    def show 
    @user = User.find(params[:id]) 
    # debugger 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     #Handle a successful save 
     log_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
     #Handle a successful update. 
     flash[:success] = "Profile updated" 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:name, :email, :password, :password_confirmation) 
    end 

    #Before filters 

    # Confirms a logged-in user 
    def logged_in_user 
     flash[:danger] = "Please login to access this page." 
     redirect_to login_url 
    end 

    def correct_user 
     @user - User.find(params[:id]) 
     redirect_to(root_url) unless @user == current_user 
    end 
end 

並且最後在這裏是錯誤:

1) Failure: 
UsersEditTest#test_unsuccessful_edit [/home/robert/sample_app/test/integration/users_edit_test.rb:32]: 
expecting <"users/edit"> but rendering with <[]> 


    2) Failure: 
UsersEditTest#test_successful_edit [/home/robert/sample_app/test/integration/users_edit_test.rb:15]: 
expecting <"users/edit"> but rendering with <[]> 


    3) Failure: 
UsersControllerTest#test_should_redirect_update_when_logged_in_as_wrong_user [/home/robert/sample_app/test/controllers/users_controller_test.rb:37]: 
Failed assertion, no message given. 


    4) Failure: 
UsersControllerTest#test_should_redirect_edit_when_logged_in_as_wrong_user [/home/robert/sample_app/test/controllers/users_controller_test.rb:30]: 
Failed assertion, no message given. 

這是令人討厭的原因,我沒有看到任何不同於本書和我擁有的代碼(大多數部分都是從本書複製和粘貼的)。在這本書中它顯然有效,但是當我運行測試時,我得到了這四個失敗。

+0

您是否嘗試過在測試中嘗試做什麼?當你進入「/ users/1/edit」會發生什麼?你有用戶編輯表單嗎? – dwenzel

回答

0

我明白了,您的代碼中存在拼寫錯誤。

在您的users_controller.rbcorrect_user方法中,您有:@user - User.find(params[:id]),應該是:@user = User.find(params[:id])

修改成:

def correct_user 
    @user = User.find(params[:id]) 
    redirect_to(root_url) unless @user == current_user 
    end 

看看是否能解決您的問題。

如果不是,請嘗試將these two methods添加到您的SessionsHelper模塊中。

如果這還不能解決您的問題。我建議你克隆original working repo from github並試圖找出你在你的版本中錯過了什麼。我克隆了這個github倉庫,所有的測試都通過了。

+1

無論是改變還是添加這兩種方法都有幫助......但原始回購確實有效。我不知道它存在謝謝! – TinaTinaShanoose