Rails - 在模型规范中设计测试认证

时间:2012-10-10 23:31:33

标签: ruby-on-rails ruby-on-rails-3 authentication devise

我觉得这应该是一个简单的问题,但我很难找到答案。我已经在我的Rails项目中设置了身份验证设计,并且它运行良好。我还定制了密码验证和登录要求。具体来说,一个人应该能够使用他们的用户名或电子邮件登录,并且电子邮件不应区分大小写。

如何在我的型号规格中测试?具体测试:

  1. 使用电子邮件登录(全部更低)并且密码有效
  2. 使用电子邮件登录(全部上方),密码有效
  3. 使用用户名和密码登录有效
  4. 使用用户名(jumbled case)登录,密码无效
  5. 基本上,我只需要一个函数来接收登录详细信息并告诉我devise是否会对其进行身份验证。但我无法在任何示例中找到这样的函数,也无法在设计文档中构建这样的函数。

    我确信它确实在工作,并且可以在我的请求规范中对其进行测试,但是正如模型中定义的那样,它们也应该是模型测试。

    我经常发现的唯一设计测试是在控制器中,这没有帮助,因为它只是自动登录用户而无需登录详细信息。

1 个答案:

答案 0 :(得分:3)

嗯,这里有两个不同的组件:

1)寻找用户
2)验证用户的密码

查找用户由find_for_database_authenticationinfo 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