Testing and refactoring go hand in hand. Refactoring is all about improving code without changing its behavior. Testing is all about making sure you don't change the behavior while you are improving the code.
 
测试和重构一般都是联合起来适用的。重构用来改良代码,而不对其行为做改动。测试是用来确保你在改良代码的同时不改变其行为。
 
在重构full_name方法之前,我们先加一个单元测试。
#user_test.rb
require File.dirname(__FILE__) + '/../test_helper'
 
class UserTest < Test::Unit::TestCase
   fixtures :users
   def test_full_name_without_milld_initial
          user=User.new(:first_name=>"John", :last_name=>'Doe')
          assert_equal 'John Doe', user.full_name
   end
 
   
   def test_full_name_with_milld_initial
          user=User.new(:first_name=>"John", :middle_initial=>'H', :last_name=>'Doe')
          assert_equal 'John H. Doe', user.full_name
   end
end
 
打开autotest
 
#model/user.rb
首先,将full_name方法的内容替换成:
 
[first_name, middle_initial, last_name].join(' ')
这样2个测试都没通过,因为middle_initial不存在,中间会加两个空格,如果middle_initial存在,少了一个"."
 
然后想到,这个代码变成
[first_name, middle_initial, last_name].compact.join(' ')
用compact方法把多的空格变成一个。然后join到一起,但是"."的问题还是没解决。
那么对于middle_initial我们调用一个方法,如果它存在的话就变成相应的形式即可。
 
最后就写成这样:
def full_name
  [first_name, middle_initial_with_period, last_name].compact.join( ' ')
end

def middle_initial_with_period
  "#{middle_initial}." unless middle_initial.blank?
end
 
这儿还有一点还要注意,一般不要适用.nil?判断是否为空,用.blank?方法。