リファクタリングRubyエディション6.5のテストコードを書いてみた

今、リファクタリング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で返すようなことをやると、うまくテストコードが動きませんでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です