名を名乗れ。

とりあえず、ユーザmodelの中に、本名の項目を作ろう。
family_nameとmiddle_nameとgiven_nameね。
外人も使うかも知れないからねwww

$ script/generate migration AddColumnFamilyNameAndMiddleNameAndGivenNameToUser family_name:string middle_name:string given_name:string

んで、編集。
db/migrate/*数字*_add_column_family_name_and_middle_name_and_given_name_to_user.rb

class AddColumnFamilyNameAndMiddleNameAndGivenNameToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :family_name, :string,   :limit => 100, :default => ''
    add_column :users, :middle_name, :string,   :limit => 100, :default => '', :null => true
    add_column :users, :given_name,   :string,  :limit => 100, :default => ''
  end

  def self.down
    remove_column :users, :given_name
    remove_column :users, :middle_name
    remove_column :users, :family_name
  end
end

middle_nameは、無い場合があるけど、まあ、普通の文化圏の方なら、名字と名前は無い事は無いでしょう。

ホントに?www

んで、validationを書こう。
app/models/user.rb

   validates_format_of       :email,    :with => Authentication.email_regex, :message => Authentication.bad_email_message
 
+  validates_presence_of     :family_name
+  validates_format_of       :family_name,     :with => Authentication.name_regex,  :message => Authentication.bad_name_message
+  validates_length_of       :family_name,     :maximum => 100
+
+  validates_format_of       :middle_name,     :with => Authentication.name_regex,  :message => Authentication.bad_name_message, :allow_nil => true
+  validates_length_of       :middle_name,     :maximum => 100
+
+  validates_presence_of     :given_name
+  validates_format_of       :given_name,     :with => Authentication.name_regex,  :message => Authentication.bad_name_message
+  validates_length_of       :given_name,     :maximum => 100
+
   # HACK HACK HACK -- how to do attr_accessible from here?


んじゃあ、ちょっとfixture書き換える。
test/fixtures/users.yml

   nickname:                  quentin
+  family_name:               Family
+  middle_name:               Middle
+  given_name:                Given
   email:                     quentin@example.com

   nickname:                  aaron
+  family_name:               Hogehoge
+  middle_name:               
+  given_name:                Fugafuga
   email:                     aaron@example.com

   nickname:                  old_password_holder
+  family_name:               名字
+  middle_name:               ミドル・ネーム
+  given_name:                名前
   email:                     salty_dog@example.com
 
  nickname: admin
+  family_name:               アドミン
+  middle_name:               ザ
+  given_name:                管理者
   email: admin@example.com

んで、テストコードを足す。
test/unit/user_test.rb

   fixtures :users
 
+  def test_invalid_with_empty_attributes
+    user = User.create
+    assert !user.valid?
+    assert user.errors.invalid?(:nickname)
+    assert user.errors.invalid?(:email)
+    assert user.errors.invalid?(:family_name)
+    assert user.errors.invalid?(:given_name)
+  end

んで、テスト。

$ ruby test/unit/user_test.rb
=> Loaded suite test/unit/user_test
=> Started
=> .
=> Finished in 0.108762 seconds.
=> 
=> 1 tests, 5 assertions, 0 failures, 0 errors

ん、スバラシイぃ:-)
まあ、何がわかったって、新規User作成時に、nicknameとemailとfamily_nameとgiven_nameのいずれかで、validation_hogehogeがエラーを返してないかどうかを見ているだけなんだけどwww
まあ、でも、今やったのって、validation書いただけだもんねぇ...

んじゃあ、もう少し、コードを足すか。
test/unit/user_test.rb

+  def test_invalid_with_empty_attributes
+    user = User.create
+    assert !user.valid?
+    assert user.errors.invalid?(:nickname)
+    assert user.errors.invalid?(:email)
+    assert user.errors.invalid?(:family_name)
+    assert user.errors.invalid?(:given_name)
+  end
+
+  def test_should_create_user
+    assert_difference 'User.count' do
+      user = create_user
+      assert !user.new_record?, "#{user.errors.full_messages.to_sentence}"
+    end
+  end
+
+  protected
+    def create_user(options = {})
+      record = User.new({
+        :nickname => "Nick",
+        :email => 'quire@example.com',
+        :password => 'quire69',
+        :password_confirmation => 'quire69',
+        :family_name => "Family",
+        :middle => "Middle",
+        :given_name => "Given"
+      }.merge(options))
+      record.register! if record.valid?
+      record
+    end
+

んで、テスト。

$ ruby ./test/unit/user_test.rb
Loaded suite test/unit/user_test
Started
.F
Finished in 0.081857 seconds.

  1) Failure:
=> test_should_create_user(UserTest)
=>     [test/unit/user_test.rb:21:in `test_should_create_user'
=>      /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/core_ext/test/unit/assertions.rb:46:in `assert_difference'
=>      test/unit/user_test.rb:19:in `test_should_create_user'
=>      /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `__send__'
=>      /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run']:
=> Nickname can't be blank and Family name can't be blank and Given name can't be blank.
=> <false> is not true.
=> 
=> 2 tests, 6 assertions, 1 failures, 0 errors

ん?
んん?
ん〜...
で、はまったはまったwww

結局、どうも、Userモデルで、attr_accessibleにfamily_nameとmiddle_nameとGiven_nameを指定していないから、ということに到達しましたwww
いやあ、これが、結局ここで何時間も止まることになる訳ですがwww

んで、修正。
app/models/user.rb

-  attr_accessible :login, :email, :name, :password, :password_confirmation
+  attr_accessible :email, :password, :password_confirmation, :nickname, :family_name, :middle_name, :given_name

で、これでどうよ?

$ ruby ./test/unit/user_test.rb
=> Loaded suite test/unit/user_test
=> Started
=> .E
=> Finished in 0.142293 seconds.
=> 
=>   1) Error:
=> test_should_create_user(UserTest):
=> SocketError: getaddrinfo: nodename nor servname provided, or not known
(略)
=> 2 tests, 5 assertions, 0 failures, 1 errors

はいいいいっ!?

で、はまるはまるwwww
結局、どうも、config/initializers/mail.rbで、設定を端折っていたからだと思われ。
で、ちゃんと設定して、

$ ruby test/unit/user_test.rb
Loaded suite test/unit/user_test
Started
.E
=>Finished in 2.002131 seconds.
=>
=>  1) Error:
=>test_should_create_user(UserTest):
=>Net::SMTPFatalError: 550 5.1.2 Bad destination system: quire@example.com
(略)
=> 2 tests, 5 assertions, 0 failures, 1 errors

はいいいっ!?
じゃあ、test/unit/user_test.rbのcreate_userメソッドの中の:emailを、まともなメールアドレスに書き換える。

=> Loaded suite test/unit/user_test
=> Started
=> .E
=> Finished in 3.069374 seconds.
=> 
=>   1) Error:
=> test_should_create_user(UserTest):
=> Net::SMTPFatalError: 550 5.7.0 From address is not one of your addresses.
(略)
=> 2 tests, 5 assertions, 0 failures, 1 errors

もう、なんか、ねwww
どうでもイイ気がしてきたwww