今、リファクタリングRubyエディションを読んでいます。6.5 一時変数からチェインへで、Selectクラスは、@optionsという配列にadd_optionを呼ぶたびに西暦を加えていきます。このテストコードを考えたのですが、結構面倒だったので、記事を書きます。
はじめ、テストコードでは配列をアサートすればいいかなと考えたのですが、そうではなかったです。配列とSelectの要素を比較するため、Selectクラスに要素のサイズを得るメソッドsizeと要素を取り出すメソッドelemを追加しました。
Selectクラスに追加したコード
def size @options.size end def elem(i) @options[i] end
また、Selectの要素と配列の要素を比較するため、Test::Unitのassert_blockを使いました。テストコードは次のようになります。
require ‘test/unit’
require_relative ‘select’
class TestSelect < Test::Unit::TestCase def test_add_options result = Select.add_options expected_result = [1999, 2000, 2001, 2002] assert_block("array error") { boolean = true if (expected_result.size != result.size) boolean = false else for i in 0...expected_result.size do if (expected_result[i] != result.elem(i)) boolean = false end end boolean end } end end [/ruby] テスト対象コードをいじるのはあまり好ましくないだろうけど、ちょっと他の方法は思いつきませんでした。また、asssert_blockを使うときには、どの要素の値がどうで、期待値がどうとか表示できるようにした方がいいのでしょうが、目的がリファクタリングのためのテストコード作成だったので、そこまではやりませんでした。なお、assert_block内で、真偽値をreturnで返すようなことをやると、うまくテストコードが動きませんでした。