我写了一个测试,应该描述@user和found_user通过密码匹配应该相同的情况这也描述了它们不同的时候我没有使用designe或任何东西,而是使用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...">
我曾试图删除before块中的@user.save,但它没有成功。
我不确定他们为什么会有不同的结果,也不知道我做错了什么我对rspec和一般测试还比较陌生。
我应该提到,我的authenticate方法正在rails控制台中工作所以我遇到了一个应用程序代码工作,但测试失败的情况。
任何帮助都将不胜感激。
我的用户类在这里:https://gist.github.com/DavidVII/f190d1f1e114234bb7d7
谢谢!
最佳答案
您的测试不能使用bcrypt密码散列(我可以从字符串的形式看出您在使用什么),因为它会为每次密码更改生成一个新的随机salt。这是件好事,不要改变这种行为。
因此,您不应该编写测试来查找存储的密码是否等于已知值目前还不清楚您是否打算在测试中这样做,或者由于使用has_secure_pasword
获得的所有抽象而意外地过度简化了测试,或者其他一些事情导致您使用当前代码。
相反,您关于密码处理的测试应该是更黑的,并断言您可以使用已知的密码登录,而不使用任何其他密码登录(包括代码破坏情况,如nils、空字符串、超长密码和匹配哈希密码的字符串)。