2017-10-24 11 views
0

Hartlのチュートリアルを見て、答えを探しましたが、何も見つかりませんでした。 (答えが存在するかもしれませんが、章が更新され、新しい版で交換されているため、見つからない場合があります)Michael HartlのチュートリアルChapter 10.2.2、リスト10.26のテストに失敗しました

私は10.2.2にあります。レールテストをリスト10.26に示します。ここ

は私のテストのためのエラーです:

ERROR["test_should_redirect_edit_when_logged_in_as_wrong_user", UsersControllerTest, 1.5802158990409225] 
test_should_redirect_edit_when_logged_in_as_wrong_user#UsersControllerTest (1.58s) 
BCrypt::Errors::InvalidHash:   BCrypt::Errors::InvalidHash: invalid hash 
      app/controllers/sessions_controller.rb:9:in `create' 
      test/test_helper.rb:32:in `log_in_as' 
      test/controllers/users_controller_test.rb:29:in `block in <class:UsersControllerTest>' 

ERROR["test_should_redirect_update_when_logged_in_as_wrong_user", UsersControllerTest, 1.606778411893174] 
test_should_redirect_update_when_logged_in_as_wrong_user#UsersControllerTest (1.61s) 
BCrypt::Errors::InvalidHash:   BCrypt::Errors::InvalidHash: invalid hash 
      app/controllers/sessions_controller.rb:9:in `create' 
      test/test_helper.rb:32:in `log_in_as' 
      test/controllers/users_controller_test.rb:36:in `block in <class:UsersControllerTest>' 

    35/35: [=====================================================] 100% Time: 00:00:01, Time: 00:00:01 

Finished in 1.71823s 
35 tests, 87 assertions, 0 failures, 2 errors, 0 skips 

テスト/備品/ users.yml

michael: 
    name: Michael Example 
    email: [email protected] 
    password_digest: <%= User.digest('password') %> 

archer: 
    name: Sterling Archer 
    email: [email protected] 
    password_digest: <%= User.digest('password') % 

テスト/コントローラ/ users_controller_test.rb

require 'test_helper' 

class UsersControllerTest < ActionDispatch::IntegrationTest 

    def setup 
    @user = users(:michael) 
    @other_user = users(:archer) 
    end 

    test "should get new" do 
    get signup_path 
    assert_response :success 
    end 

test "should redirect edit when not logged in" do 
    get edit_user_path(@user) 
    assert_not flash.empty? 
    assert_redirected_to login_url 
    end 

    test "should redirect update when not logged in" do 
    patch user_path(@user), params: { user: { name: @user.name, 
               email: @user.email } } 
    assert_not flash.empty? 
    assert_redirected_to login_url 
    end 

    test "should redirect edit when logged in as wrong user" do 
    log_in_as(@other_user) 
    get edit_user_path(@user) 
    assert flash.empty? 
    assert_redirected_to root_url 
    end 

    test "should redirect update when logged in as wrong user" do 
    log_in_as(@other_user) 
    patch user_path(@user), params: { user: { name: @user.name, 
               email: @user.email } } 
    assert flash.empty? 
    assert_redirected_to root_url 
    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]) 

    end 

    def new 
    @user = User.new 
    end 

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

    def edit 
    # can take out because already in correct_user  @user = User.find(params[:id]) 
    end 

    def update 
    # can take out because already in correct_user @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 
     unless logged_in? 
     flash[:danger] = "Please log in." 
     redirect_to login_url 
     end 
    end 

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

end 

すべてのテストに合格すると言ったら、2つのテストに失敗したのはなぜですか?私はエラーメッセージに記載されている行を見てきましたが、何が間違っているのか分かりません。 助けてくれてありがとう。

EDIT:セッションコントローラ

class SessionsController < ApplicationController 
    def new 
    end 

    def create 

    @user = User.find_by(email: params[:session][:email].downcase) 

    if @user && @user.authenticate(params[:session][:password]) 
    log_in @user 
    params[:session][:remember_me] == '1' ? remember(@user) : forget(@user) 
    redirect_to @user 

    else 
    flash.now[:danger] = 'Invalid email/password combination' # Not quite right! 
    render 'new' 
    end 
    end 

    def destroy 
    log_out if logged_in? 
    redirect_to root_url 
    end 
end 

答えて

1

"スターリングアーチャー"テストフィクスチャのpassword_digestに、終了角括弧がありません。

password_digest: <%= User.digest('password') % 

でなければなりません

password_digest: <%= User.digest('password') %> 
+0

ああ男!よく目撃された。これに数日間執着しました。ありがとうございました。 – Owen

0

はラインでより注意深く見て:

BCrypt::Errors::InvalidHash: invalid hash 
      app/controllers/sessions_controller.rb:9:in `create' 

あなたはこのコントローラのコードを指定していない、と私は間違っているかもしれないものを伝えることはできません。

+0

申し訳ありません、はい、今セッションコントローラを含めるように編集し、私はまだまで、トレースに指定されている各ファイルをチェックし@Owenその行 – Owen

+0

と間違っているものを理解しませんエラーが見つかりました。 次の行はtest/test_helper.rb:32: 'log_in_as 'にあります。 – LazyNick7

+0

これは私の問題です。エラーは表示されません。すべてのコードは本からコピーされます。 – Owen

関連する問題