我目前正在开发的应用程序的 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 方法,我们没有使用 devise 或任何其他与身份验证相关的 gem。