Как проверить обновление пароля пользователя в RSpec

Я использую Rails 5.2, Ruby 2.4.1 и Rspec. Я пытаюсь выполнить тест автоматизации с помощью Rspec для обновления пароля пользователя. Я знаю, что код работает, проверяя вручную.

Тест RSpec не проходит условие @ user.update_attributes (user_params) в контроллере, а затем переходит к условию else. Таким образом, мой тест RSpec говорит, что пароли по-прежнему равны друг другу. Как я могу добиться, чтобы мой тест RSpec прошел это условие?

Вот метод

# Creates user, saves old password, generates a url for user to go to, updates password, reloads user, and test if old password equals new password
context "with a valid token" do
    it "updates the user's password and resets the token" do
        test_users = User.create(first_name: 'chase', last_name: 'dougherty', email: '[email protected]', password: '1', password_confirmation: '1')
        old_password = test_users.password
        test_users.generate_password_reset_token!
        patch :update, params: { id: test_users.password_reset_token, user: { password: 'newpassword', password_confirmation: 'newpassword' } }
        test_users.reload
        expect(test_users.password).to_not eq(old_password)
      end
    end

Вот контроллер

# Finds user, test if update_attributes is true, updates password, logs user in, redirects user, displays flash
def update
    @user = User.find_by(password_reset_token: params[:id])
    if @user && @user.update_attributes(user_params)
      @user.update_attribute(:password_reset_token, nil)
      session[:user_id] = @user.id
      redirect_to '/maps'
      flash[:notice] = "Password updated"
    else
      flash[:notice] = "Password reset failure."
      render action: 'edit'
    end
  end

  private
  def user_params
    params.require(:user).permit(:password, :password_confirmation)
  end
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
489
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если строка update_attributes не работает, у вас, вероятно, есть некоторые проверки модели User, которые запускаются и заставляют ее возвращать false.

Также я бы посоветовал не «создавать» пользовательский объект в тестовых файлах. Тем более, что при первом запуске тестов он создаст запись, но затем каждый раз после этого он будет возвращать экземпляр User, который не сохраняется в базе данных (из-за нарушений уникальности в данных), и тесты могут не запускаться как ожидал.

Если вы не хотите очистить созданные вами пользовательские объекты после запуска теста. В противном случае вы захотите использовать factory_bot и заглушить большинство этих моделей и вызовов базы данных.

Если вы используете метод has_secure_password в своей модели user, вы можете использовать этот синтаксис для проверки того, что пароль был изменен:

it "changes user's password" do
  expect { send_request }.to change { user.reload.authenticate(password) }.from(false).to(user)
end

Другие вопросы по теме