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

时间:2013-05-17 07:18:50

标签: ruby-on-rails ruby postgresql authentication rspec

我写了一个测试,应该描述@user和found_user应该通过密码匹配相同的情况。这也描述了它们何时不同。我没有使用设计或任何东西,而是使用has_secure_password

构建我自己的身份验证
describe "return value of authenticate method" do
  before { @user.save }
  let(:found_user) { User.find_by(email: @user.email) }

  describe "with a valid password" do
    it { should eq found_user.authenticate(@user.password) }
  end

  describe "with an invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate('invalid') }

    it { should_not eq user_for_invalid_password }
    specify { expect(user_for_invalid_password).to be_false }
  end
end

失败的部分是with a valid password阻止。错误消息清楚地表明password_digest未匹配

这是相关输出:

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

我试图删除前块中的@ user.save,认为可以解决它,但事实并非如此。

我不确定为什么他们的出现方式不同或者我做错了什么。我对rspec和一般测试都很新。

我应该提一下我的身份验证方法是在rails控制台中运行。所以我遇到了应用程序代码工作的情况,但测试失败了。

非常感谢任何帮助。

我的用户类位于:https://gist.github.com/DavidVII/f190d1f1e114234bb7d7

日Thnx!

1 个答案:

答案 0 :(得分:3)

您的测试不适用于bcrypt密码哈希(我可以从字符串的形式告诉您使用的是什么),因为它会为每次密码更改生成一个新的随机盐。这是一件好事,不要改变这种行为。

因此,您不应编写查找存储密码等于已知值的测试。如果您打算在测试中使用它,或者由于使用has_secure_pasword获得的所有抽象而意外地过度简化了测试,或者其他一些事情导致您使用当前代码,则不是100%清楚。< / p>

相反,您对密码处理的测试应该更黑盒子,并断言您可以使用已知密码登录,而不是使用任何其他密码登录(包括代码破坏案例,如nils ,空字符串,超长密码和与散列密码匹配的字符串。)