RSpec-我测试中的密码不匹配

yftpprvb  于 2022-10-15  发布在  Ruby
关注(0)|答案(2)|浏览(156)

我写了一个测试,应该描述@USER和FOUND_USER通过密码匹配应该相同的情况。这也描述了它们何时不同。我没有使用DEVISE或任何其他工具,而是使用has_secure_password构建我自己的身份验证

  1. describe "return value of authenticate method" do
  2. before { @user.save }
  3. let(:found_user) { User.find_by(email: @user.email) }
  4. describe "with a valid password" do
  5. it { should eq found_user.authenticate(@user.password) }
  6. end
  7. describe "with an invalid password" do
  8. let(:user_for_invalid_password) { found_user.authenticate('invalid') }
  9. it { should_not eq user_for_invalid_password }
  10. specify { expect(user_for_invalid_password).to be_false }
  11. end
  12. end

出现故障的部分是with a valid password块。错误消息清楚地显示password_digest不匹配
以下是相关的输出:

  1. expected: password_digest: "$2a$04$cDKhuWzsZuW8Gm4t5fJjpu6rmbwh10ZAt2Yae.BO0iuD...">
  2. got: password_digest: "$2a$04$jwfHjoLI0RpDIAEr9SMKGOZqeH.J5ILOkzalKCYQdDW4...">

我曾尝试删除BEFORE块中的@user.save,以为这样可能会解决问题,但没有成功。
我真的不知道为什么他们会有不同的想法,也不知道我做错了什么。总的来说,我对RSpec和测试还很陌生。
值得一提的是,我的身份验证方法在Rails控制台中有效。因此,我遇到了这样一种情况:应用程序代码可以工作,但测试失败。
任何帮助都将不胜感激。
我的User类在这里:https://gist.github.com/DavidVII/f190d1f1e114234bb7d7
太棒了!

p5cysglq

p5cysglq1#

您的测试不能使用bcrypt密码散列(我可以从字符串的形式看出您使用的是什么),因为它会为每次密码更改生成一个新的随机SALT。这是一件好事,不要改变这种行为。
因此,您不应该编写寻找存储的密码等于已知值的测试。不清楚是您在测试中有意这样做,还是由于使用has_secure_pasword获得的所有抽象而意外过度简化了测试,或者其他一些因素导致您使用当前代码。
相反,关于密码处理的测试应该更加黑盒,并Assert您可以使用已知的密码登录,而不能使用任何其他密码登录(包括NILS、空字符串、超长密码和与散列密码匹配的字符串等代码破译情况)。

hgtggwj0

hgtggwj02#

  1. describe "with an invalid password" do
  2. let(:@user_for_invalid_password) { found_@user.authenticate('invalid') }
  3. it { should_not eq @user_for_invalid_password }
  4. specify { expect(@user_for_invalid_password).to be_falsey}
  5. end
  6. end

相关问题