1

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

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

  1. 使用电子邮件登录(全部较低)和密码有效
  2. 使用邮箱登录(全部为大写),密码有效
  3. 使用用户名和密码登录是有效的
  4. 使用用户名(大小写混乱)和密码登录无效

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

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

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

4

1 回答 1

3

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

1) 查找用户
2) 验证用户密码

查找用户由find_for_database_authentication有关“登录”处理用户名和电子邮件的信息)处理

密码验证由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
于 2012-10-10T23:55:07.440 回答