在RSpec控制器规范中模拟具有错误密码的登录尝试会引发BCrypt :: Errors :: InvalidHash

时间:2015-07-29 19:20:10

标签: 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

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

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源代码,这意味着存储在数据库中的密码摘要无效。由于所有三个块都使用相同的let块来创建用户,因此我不知道为什么使用不正确的密码而不是正确的密码会发生这种情况。当我启动rails s并尝试通过视图登录时,它也能正常工作。有谁知道发生了什么事?

我们使用的是内置的has_secure_password方法,我们没有使用设计或任何其他与身份验证相关的宝石。

1 个答案:

答案 0 :(得分:0)

重置数据库修复了这个问题,虽然我仍然不清楚是什么原因引起的,或者为什么它只是在这种特殊情况下才发生。