【问题标题】:Rails - Devise testing authentication in model specsRails - 在模型规范中设计测试认证
【发布时间】:2012-10-01 13:19:41
【问题描述】:

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

如何在我的模型规格中对此进行测试?具体测试:

  1. 使用邮箱登录(均低于)且密码有效
  2. 使用邮箱登录(全部为大写),密码有效
  3. 用户名密码登录有效
  4. 使用用户名登录(大小写错误)和密码无效

基本上,我只需要一个函数来接收登录详细信息并告诉我设计是否会对其进行身份验证。但是我在任何示例中都找不到这样的函数,或者在设计文档中以任何方式构造这样的函数。

我相信它确实在工作,并且可以在我的请求规范中对其进行测试,但由于它是在模型中定义的,因此感觉它们也应该是模型测试。

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

【问题讨论】:

  • 为什么要测试 Devise 本身应该已经测试过的东西?您是否有任何可能干扰的自定义代码?
  • 这正是我想要测试它的原因。我喜欢使用其他 gem 而不是自己重写东西,但是它们中的功能可能会随着未来的变化而中断(甚至现在被破坏)。我不认为冗余测试是一件坏事。

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


【解决方案1】:

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

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

【讨论】:

  • 我同意@ryanbigg 的观点,即验证用户不是你应该测试的东西。但是,如果您必须添加自定义代码以使 find_for_database_authentication 工作,我认为测试工作正常。
猜你喜欢
  • 2012-12-25
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多