2015-08-04 7 views
0

Я новичок в рельсах, и тестирование по-прежнему немного загадочно для меня. Я безуспешно искал способ тестирования форм без добавления драгоценных камней. Вот что я пытаюсь сделать.Проверка формы изменения пароля Rails

В моей форме есть поля old_password, new_password и confirm_password.

<%= form_for @user, :url => "change_password" do |f| %> 
    <%= f.label :Current_Password %> 
    <%= f.password_field :old_password, class: 'form-control' %> 
    <%= f.label :New_Password %> 
    <%= f.password_field :new_password, class: 'form-control' %> 
    <%= f.label :Confirm_Password %> 
    <%= f.password_field :password_confirmation, class: 'form-control' %> 
    <%= f.submit "Change Password", class: "btn btn-primary" %> 
<% end %> 

Мои маршруты

# Users 
    resources "users" 

    patch 'users/:id/change_password' => 'users#change_password' 

Мои пользователи контроллера действия

def change_password 
    # Change password. 
    @user = User.find(params[:id]) 
    if @user and @user.authenticate(params[:user][:old_password]) 
     if params[:user][:new_password] == params[:user][:password_confirmation] 
     @user.update_attribute(:password_digest, 
      User.digest(params[:user][:new_password])) 
     flash[:success] = "Password changed sucesfully." 
     redirect_to @user 
     else 
     flash.now[:danger] = "Password and confirmation do not match." 
     render 'edit' 
     end 
    else 
     flash.now[:danger] = "Incorrect password." 
     render 'edit' 
    end 
    end 

Мой тест. Это очень похоже на тест из Rails Tutorial. Это часть, которую я не понимаю.

test "password change wrong password" do 
    get edit_user_path(@user) 
    assert_template 'users/edit' 

    # Submit wrong password. 
    patch user_path(@user), user: { old_password: "invalid", 
            new_password: "foobar11", 
            password_confirmation: "foobar11" } 

    # Flash not empty. 
    assert_not flash.empty? 

    # Redirected to edit page. 
    assert_template 'users/edit' 

    # Password not changed in database. 

    end 

Тест терпит неудачу на assert_template «пользователей/редактировать»

expecting <"users/edit"> but rendering with <[]> 
+0

Кажется, что представление было успешным, и вы получили перенаправлены на страницу пользователя. Попробуйте добавить некоторый 'raise', чтобы узнать, какой путь ваш тест. – BroiSatse

+0

У меня есть часть шаблона, но теперь я не знаю, как проверить, изменен ли пароль в базе данных. – Terrytreks

ответ

0

Я получил это работает, и разделит мое решение, чтобы помочь другим. Кроме того, я не думаю, что я сделал все правильно Rails Way.

Я исправлял неправильный маршрут. Вместо того, чтобы переходить на пользовательский путь (@user), мне нужно выполнить патч на «# {user_path (@user)}/change_password». Это выглядит уродливо. Есть ли способ лучше?

Мой полный тест

test "password change wrong password" do 

    # Submit wrong password. 
    patch "#{user_path(@user)}/change_password", :user => { 
      :old_password => 'invalid', 
      :new_password => 'foobar11', 
      :password_confirmation => 'foobar11' } 

    # Show to edit page. 
    assert_template 'users/edit' 

    # Flash not empty. 
    assert_not flash.empty? 

    # Password not changed in database. 
    @user.save 
    @user.reload.authenticate("password") 
    end 
Смежные вопросы