我觉得这应该是一个简单的问题,但我很难找到答案。我已经在我的Rails项目中设置了身份验证设计,并且它运行良好。我还定制了密码验证和登录要求。具体来说,一个人应该能够使用他们的用户名或电子邮件登录,并且电子邮件不应区分大小写。
如何在我的型号规格中测试?具体测试:
基本上,我只需要一个函数来接收登录详细信息并告诉我devise是否会对其进行身份验证。但我无法在任何示例中找到这样的函数,也无法在设计文档中构建这样的函数。
我确信它确实在工作,并且可以在我的请求规范中对其进行测试,但是正如模型中定义的那样,它们也应该是模型测试。
我经常发现的唯一设计测试是在控制器中,这没有帮助,因为它只是自动登录用户而无需登录详细信息。
答案 0 :(得分:3)
嗯,这里有两个不同的组件:
1)寻找用户
2)验证用户的密码
查找用户由find_for_database_authentication
(info on having username and email handled by "login")
验证密码由valid_password?
方法(info)处理
所以,你想把这个测试分解为:
context "finding a user" do
let(:user) { FactoryGirl.create(:user) }
it "can find by lower email" do
User.find_for_database_authentication( {login: user.email.downcase} ).should eq(user)
end
it "can find by upper email" do
User.find_for_database_authentication( {login: user.email.upcase} ).should eq(user)
end
it "can find by jumbled username" do
scrambled_username = user.username.downcase.chars.map{|c| rand() > 0.5 ? c.capitalize : c}.join
User.find_for_database_authentication( {login: username} ).should eq(user)
end
end
context "authenticating a user" do
let(:user) { FactoryGirl.create(:user, password: "password123", password_confirmation: "password123") }
it "will validate a correct password" do
user.valid_password?("password123").should be_true
end
it "will not validate an incorrect password" do
user.valid_password?("bad-password").should be_false
end
end