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?方法。