Ruby on Rails Tutorial (36)

朝練メモ。昨晩の続きを。

とりあえず user_spec.rb

箇条書きで俯瞰してみます。

  • 可視状態な属性の確認
  • new で作ったオブジェクトが valid であり、admin ではないことを確認
  • User with admin attribute set to 'true' な時は admin であることを確認
  • name および email 属性がブランク値の場合は invalid になることを確認
  • name の文字列長の確認
  • email フォーマットの確認
  • User when email address is already taken な時は invalid になることを確認
  • password 関連のチェック
    • password 属性がブランク値の場合は invalid になることを確認
    • User when password doesn't match confirmation な時は invalid になることを確認
    • password_confirmation 入力されているかを確認
    • 入力文字列長のチェック
  • 認証関連
    • ちょっとここ、後で確認
  • remember token がブランクではないことを確認
  • micropost との関連
  • following

最後らへんは色々と微妙。とりあえず authenticate というメソドが謎。色々確認したところでは Rails 3.1 あたりから認証のための仕組みが本体に入った模様。authenticate メソドは has_secure_password メソドの呼び出しで盛り込まれるとのこと。

写経時にテキストを全然見てない、というかコードさえも見てないことが自分で分かって色々と微妙だなぁ。
時間切れなカンジなのでとりあえずエントリ投入。続きは適宜追記ということにて。

続き

あら、認証部分の試験、不思議な記述がありますね。

  describe "return value of authenticate method" 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

with invalid password の方。found_user.authenticate("invalid") は false を戻すはずなので @user とは異なっているべきで、かつ false じゃないといけないのですが specify というソレははじめて見ました。元々は it ではなくて specify だったらしいというソレは昔のるびまに出てました。
あるいは remember token な試験ですが

  describe "remember token" do
    before { @user.save }
    its(:remember_token) { should_not be_blank }
  end

となっててこれは

  before_save :create_remember_token

な指定があるメソドの定義が以下で

  private

    def create_remember_token
      self.remember_token = SecureRandom.urlsafe_base64
    end

save した後はブランクではあり得ませんね、という確認になるのか。
次は micropost associations な確認とのことなのですが冒頭で

  • created_at な順になってること
  • dependent :destroy な動作確認

をしているのか。で、status なソレで何を確認しているかというと、

  • unfollowed_post として follow してないユーザの micropost を作る
  • User なオブジェクトを作って @user が follow してる状態にした上でそのユーザが三つ micropost を投入した状態に

これで

  • @user の feed に
    • newer_micropost を含む
    • older_micropost を含む
    • unfollowed_psot は含まない
    • 新規に作った三つは含む

ということを確認しているのか。成程。つうか include って便利なメソドだな。以降で出てくる following な試験でも多用されてます。