2017-10-24 1 views
0

Hartl의 튜토리얼을 살펴보고 답변을 찾았지만 아무 것도 발견하지 못했습니다. (기존의 답변이있을 수 있지만 챕터가 업데이트되어 새로운 버전에서 전환 되었기 때문에 존재하지 않으면 찾을 수 없습니다.)Michael Hartl의 튜토리얼 10.26 장에 나열된 테스트가 실패 함

오전 10.2.2에 있습니다. 10.26 레일 테스트 목록 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 개의 테스트에 실패했습니다. 오류 메시지에 언급 된 줄을 살펴 보았지만 무엇이 잘못되었는지 확신 할 수 없습니다. 도움 주셔서 감사합니다.

편집 : 라인에 더주의 깊게

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

"Sterling Archer"테스트 픽스쳐의 경우 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

관련 문제