我如何在rspec中编写测试以确保密码不会在我的Ruby on Rails应用程序中以纯文本形式存储?
我并不关心实现,因为我不知道究竟是什么插件或我将如何编写密码加密(有很多例子)。
我只想要一个独立于实现的失败测试。然后,当我实现我的代码时,我可以确信我没有纯文本密码。
我想我需要保存用户(使用密码),然后再次获取用户并检查密码是否与纯文本版本不相同。
我是否在正确的轨道上?
我有这些空的测试:
describe "password encryption" do
it "should have an encrypted password attribute"
it "should set the encrypted password"
it "should encrypt the password"
end
答案 0 :(得分:4)
正如您所说,您所描述的行为是密码以其简单形式无法恢复,因此请尝试编写描述该密码的规范,而不是加密,这更像是一个实现细节。
specify "a user's password should not be readable when they are loaded from the database" do
my_password = 'foobar22'
u = User.create :password => my_password, :password_confirmation => my_password
u.reload
u.password.should_not == my_password
end
可以是结构化的&措辞更好,但如果你只是存储和放大,会给出一个失败的规范。读出明文密码进行身份验证。
我认为除非你自己实施加密(这通常是不可取的),否则你不会考虑加密是如何工作的。
如果您选择使用现成的系统(例如设计,清除......),您可能会发现编写集成测试以检查您将系统连接到项目的方式正常工作,而不是测试更有用身份验证系统的具体细节(作者应该已经完成,否则会找到不同的身份验证系统!)。