:Rspec中的authenticate方法

时间:2012-04-30 15:39:43

标签: ruby-on-rails rspec railstutorial.org

我目前正在关注关于RoR的Michael Hartl教程,并且我正试图通过Rspec测试来掌握更多内容。我可以按照大部分内容进行操作,但是我对以下方法有点困惑:authenticate方法的功能:

it { should respond_to(:authenticate) }

以及它与以下代码部分的关系:

    describe "return value of authenticate" do
  before { @user.save }
    let(:found_user) { User.find_by_email(@user.email) }

  describe "with valid password" do
    it { should == found_user.authenticate(@user.password) }
  end

  describe "with invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate("invalid") }

    it { should_not == user_for_invalid_password }
    specify { user_for_invalid_password.should be_false }
  end
end

我理解使用let和相应的块赋值变量,但是我很难理解调用authenticate方法时发生了什么,它在初始行中进行了哪些身份验证?它是否针对user.rb模型进行身份验证,该模型需要存在电子邮件并且它与特定的正则表达式匹配,或者是其他内容。为清晰起见,我已经包含了user.rb代码:

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation
  has_secure_password

  before_save { |user| user.email = email.downcase }

  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
        uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }
  validates :password_confirmation, presence: true

end

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:4)

如果没有行号,我可能会误解你指的是哪一行但是这里有。使用'respond_to'方法引用的第一行代码只是询问对象是否接口处理您要求它响应的任何内容。我认为有一点缺失 - 它应该是:obj.should respond_to(:somemethod)它只是检查对象是否有一个具有该名称的方法 - 所以这是一个相当基本的测试。

关于调用authenticate方法时发生了什么的问题可能是因为您无法在user.rb中看到authenticate方法。在旧版本的Hartl教程中,有一种验证方法(我的机器上仍有它):

def self.authenticate(email, submitted_password)
 user = find_by_email(email)
 return nil if user.nil?
 return user if user.has_password?(submitted_password)
end

在代码中调用它的方式很明显,它在辅助方法或其他方面的实现略有不同......请参阅模型中对'has_secure_password'的调用?这是一种辅助方法,其中:验证生命。

查看source code/documentation了解详情。