Имитация попытки входа с неверным паролем в спецификации контроллера RSpec вызывает BCrypt::Errors::InvalidHash

Спецификация SessionController для приложения, над которым я сейчас работаю, выглядит следующим образом:

require 'rails_helper'

RSpec.describe SessionController do
  let(:user) { create(:user, phone_verified: true, email_verified: true) }

  describe "POST #create" do
    context "with valid username and password" do
      before do
        post :create, user: { username: user.username, password: user.password }
      end
      specify { expect(response).to redirect_to(dashboard_path) }
      specify { expect(session[:user_id]).to eq(user.id) }
    end

    context "with invalid username" do
      before do
        post :create, user: { username: "doesntexist", password: user.password }
      end
      specify { expect(response).to render_template(“login”) }
      specify { expect(session[:user_id]).to be_nil }
    end

    context "with invalid password" do
      before do
        post :create, user: { username: user.username, password: "badpassword" }
      end
      specify { expect(response).to render_template(“login”) }
      specify { expect(session[:user_id]).to be_nil }
    end
  end
end

Первые два блока контекста работают точно так же, как и ожидалось. Примеры в третьем блоке контекста терпят неудачу:

2) SessionController POST #create with invalid password
     Failure/Error: post :create, user: { username: user.username, password: "badpassword" }
     BCrypt::Errors::InvalidHash:
       invalid hash

Из того, что я смог выяснить в Stackru и глядя на исходный код bcrypt-ruby, это означает, что дайджест пароля, хранящийся в базе данных, является недействительным. Поскольку все три блока используют одинаковые let Блок для создания пользователя, я в недоумении, почему это может произойти с неправильным паролем, а не с правильным. Это также работает нормально, когда я запускаю rails s и попробуйте войти через представление. Кто-нибудь знает, что происходит?

Мы используем встроенный метод has_secure_password, и мы не используем devise или другие гемы, связанные с аутентификацией.

1 ответ

Сброс базы данных устранил эту проблему, хотя мне все еще не ясно, что вызвало ее или почему это произошло только при таких конкретных обстоятельствах.

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