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 と対応するブロックを使用した変数の割り当てを理解していますが、認証メソッドが呼び出されたときに何が起こっているのかを理解するのに苦労しています。最初の行で何に対して認証されていますか? 電子メールが存在する必要があり、特定の正規表現に一致することを必要とする 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 に答える