Exercises

為 email 轉小寫字母寫一個測試。這個測試使用 reload方法重新載入資料庫的資料,assert_equal 方法則是測試是否相等。為了測試下面的程式碼是否正確,先把 before_save 註解起來,看看測試是否失敗,然後再去掉註解,看測試能否通過:

test "email addresses should be saved as lower-case" do
  mixed_case_email = "[email protected]"
  @user.email = mixed_case_email
  @user.save
  assert_equal mixed_case_email.downcase, @user.reload.email
end

before_save callback 中,使用 email.downcase! 直接修改 email 的屬性值,執行測試,看看能不能這樣做:

before_save { email.downcase! }

之前為 email 格式設定的正規表示式有個缺點,就是它會讓 [email protected] 這樣的 email 通過格式驗證。現在把 [email protected] 無效的位址加進測試裡,讓測試失敗:

test "email validation should reject invalid addresses" do
  invalid_addresses = %w[user@example,com user_at_foo.org user.name@example.
                         foo@bar_baz.com foo@bar+baz.com]
  invalid_addresses.each do |invalid_address|
    @user.email = invalid_address
    assert_not @user.valid?, "#{invalid_address.inspect} should be invalid"
  end

然後再寫一個更嚴謹的正規表示式,讓測試通過:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i