ruby-on-rails - 在 RSpec Controller 规范中使用不正确的密码模拟登录尝试引发 BCrypt::Errors::InvalidHash

标签 ruby-on-rails ruby rspec bcrypt-ruby

我目前正在开发的应用程序的 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

前两个上下文 block 完全按预期工作。第三个上下文 block 中的示例失败:

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

根据我在 StackOverflow 上以及通过查看 bcrypt-ruby 源代码所能找到的信息,这意味着存储在数据库中的密码摘要无效。由于所有三个 block 都使用相同的 let block 来创建用户,所以我不知道为什么密码不正确而不是正确的密码会发生这种情况。当我启动 rails s 并尝试通过 View 登录时,它也能正常工作。有谁知道发生了什么事吗?

我们使用内置的 has_secure_password 方法,我们没有使用 devise 或任何其他与身份验证相关的 gem。

最佳答案

重置数据库解决了这个问题,虽然我仍然不清楚是什么原因造成的,或者为什么它只在这种特定情况下发生。

关于ruby-on-rails - 在 RSpec Controller 规范中使用不正确的密码模拟登录尝试引发 BCrypt::Errors::InvalidHash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31709305/

相关文章:

css - 如何通过 rails 框架使用 twitter bootstrap 显示漂亮的错误消息?

ruby - 重新组装困惑的方法

ruby-on-rails - RSpec 测试 Controller 操作创建不影响测试数据库

ruby-on-rails - Rails 没有将用户数据输入到 postgresql

ruby-on-rails - 如何在 Capybara 2.4.1 中访问 c​​ookie 和 session

ruby-on-rails - 在 Rails 中通过 belongs_to 关系查询记录

ruby-on-rails - Rails 3 打印页

ruby-on-rails - 将数组传递给 select_tag

ruby-on-rails - 如何创建类似于 javascript throttle/debounce 函数的 Rails/Ruby 方法

ruby - 如何在 ruby​​ 中代理 shell 进程