我对运行集成测试以供用户登录时遇到的错误有点困惑。以下是跟踪的前几行:
invalid hash
@ /home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/bcrypt-ruby-3.0.1/lib/bcrypt.rb:171:in `initialize'
/home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.6/lib/active_model/secure_password.rb:58:in `new'
/home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.6/lib/active_model/secure_password.rb:58:in `authenticate'
/home/benjamin/projects/LTClone/app/controllers/sessions_controller.rb:9:in `create'
所以错误来自动作中的这一行create
:
if user && user.authenticate(params[:session][:password])
它调用中authenticate
定义的方法secure_password.rb
:
def authenticate(unencrypted_password)
if BCrypt::Password.new(password_digest) == unencrypted_password
...
它调用该BCrypt::Password.new
方法,该方法定义在bcrypt.rb
:
def initialize(raw_hash)
if valid_hash?(raw_hash)
...
else
raise Errors::InvalidHash.new("invalid hash") # line 171
end
end
因此,由于某种原因,raw_hash
与 指定的正则表达式不匹配valid_hash?
,这意味着该password_digest
变量不是有效的哈希。根据这个答案,我试图验证的用户似乎是空白或无效的password_digest
,但在我调用create
测试中的操作之前,我可以puts @user.password_digest
,并且打印了哈希(并且 Rubular 说valid_hash?
正则表达式匹配它) . 我还将创建方法更改为
if user && user.password_digest && user.authenticate(params[:session][:password])
只是为了确保它真的存在。
所以现在我完全被难住了。似乎我有一个有效的password_digest
,但BCrypt::Password.new
拒绝承认它。有人知道为什么吗?