RailsCasts中国語版、#12 Refactoring User Name Part 3実戦再構築3
3516 ワード
実戦2の再構築と実戦1の再構築において,再構築,テストに関する話題について議論した.前編終了時までに
この3つの例では、冗長コードが大量に存在します.いずれも、
これにより、テスト用例コードを以下のように簡略化することができる.
簡略化されたテストコード.
実行後も、すべての使用例が通過できます.
出力表示例実行パス.
テストコードは簡単になり、それらを1つの例に移動することができます.しかし、これは同時に新しい問題をもたらしました.もしあるテスト条件が満たされていなければ、どのように識別しますか.さらに
再構築された
この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
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