RailsCasts中国語版、#12 Refactoring User Name Part 3実戦再構築3


実戦2の再構築と実戦1の再構築において,再構築,テストに関する話題について議論した.前編終了時までにUserクラスの再構築が完了したが,テスト用例コードはまだ乱れている.どうやって片付けるか見てみましょう.
require 'test_helper'
  class UserTest < ActiveSupport::TestCase
    test "full name without middle initial" do
      user = User.new(:first_name => "John", :last_name => "Smith")
      assert_equal 'John Smith', user.full_name
    end

    test "full name with middle initial" do
      user = User.new(:first_name => "Paul", :middle_initial => "P", :last_name => "Hughes")
      assert_equal 'Paul P. Hughes', user.full_name
    end

    test "full name with empty middle initial" do
      user = User.new(:first_name => "John", :middle_initial => "", :last_name => "Jones")
      assert_equal 'John Jones', user.full_name
    end
end
Userクラスのテスト用例コード.
この3つの例では、冗長コードが大量に存在します.いずれも、Userのオブジェクトをそれぞれ作成し、full_nameメソッドの戻り値が私たちの期待値と一致するかどうかを比較します.オブジェクトの作成とfull_nameの結果を返す方法を作成する必要があります.
def full_name(first, middle, last)
  User.new(:first_name => first, :middle_initial => middle, :last_name => last).full_name
end
UserTestクラスの補助方法.
これにより、テスト用例コードを以下のように簡略化することができる.
test "full name without middle initial" do
  assert_equal "John Smith", full_name('John', nil, 'Smith')
end

test "full name with middle initial" do
  assert_equal 'Paul P. Hughes', full_name('Paul', 'P', 'Hughes')
end  

test "full name with empty middle initial" do
  assert_equal "John Jones", full_name('John', '', 'Jones')
end

簡略化されたテストコード.
実行後も、すべての使用例が通過できます.
Laa-Laa:ep11 eifion$ autotest
loading autotest/rails
/opt/local/bin/ruby -I.:lib:test -rtest/unit -e "%w[test/unit/user_test.rb test/functional/users_controller_test.rb].each { |f| require f }" | unit_diff -u
Loaded suite -e
Started
...
Finished in 0.282538 seconds.

3 tests, 3 assertions, 0 failures, 0 errors

出力表示例実行パス.
テストコードは簡単になり、それらを1つの例に移動することができます.しかし、これは同時に新しい問題をもたらしました.もしあるテスト条件が満たされていなければ、どのように識別しますか.さらにassert_equalメソッドに1つの文字列を複数入力することができ、テストが不合格になったときに印刷されて位置決めされます.
require 'test_helper'

class UserTest < ActiveSupport::TestCase
  test "full name" do
    assert_equal "John Smith", full_name('John', nil, 'Smith'), 'nil middle initial'
    assert_equal 'Paul P. Hughes', full_name('Paul', 'P', 'Hughes'), 'P middle initial'
    assert_equal "John Jones", full_name('John', '', 'Jones'), 'blank middle initial'
  end

  def full_name(first, middle, last)
    User.new(:first_name => first, :middle_initial => middle, :last_name => last).full_name
  end
end

再構築されたUserTestコード
この3つの文章では,コードとテスト例をそれぞれ再構築し,コードの可読性とメンテナンス性が向上した.よし!この小さな例が、再構築やテスト用例の使用のメリットを感じさせることを願っています.
作者の授権:Your welcome to post the translate text on your blog as well if the episode is free(not Pro).I just ask that you post a link back to the original episode on railscasts.com.
テキストリンク:http://railscasts.com/episodes/12-refactoring-user-name-part-3