1

我目前正在关注 Michael Hartl 关于 RoR 的教程,并试图更多地掌握 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

非常感谢任何帮助。

4

1 回答 1

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'的调用吗?这是 :authenticate 存在的辅助方法。

检查源代码/文档以获取更多详细信息。

于 2012-04-30T17:02:30.740 回答