User has secure password

在 model 加完 password_digest 屬性也裝了 bcrypt gem 後,在 model 加上 has_secure_password 方法:

app/models/user.rb

class User < ActiveRecord::Base
  before_save { self.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, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  has_secure_password
end

此時執行測試會失敗(Red):

$ bundle exec rake test

這是因為 has_secure_password 方法會強制要通過 passwordpassword_confirmation 這兩個虛擬屬性的驗證,但在 test/models/user_test.rb 檔案裡面,setup 方法的設定,並沒有這兩個屬性:

def setup
  @user = User.new(name: "Example User", email: "[email protected]")
end

所以要加上這兩個屬性,測試才會通過(Green):

test/models/user_test.rb

def setup
    @user = User.new(name: "Example User", email: "[email protected]",
                     password: "foobar", password_confirmation: "foobar")
  end

這樣測試就會通過了(Green):

$ bundle exec rake test