Test::Unitとdefine_methodのコンボ

Rubyのテストを書く際、RSpecとTest::Unitを行ったり来たりしているのだけど、最近はTest::Unitのターン。

で、jijixi's diary - 実は Rails で Test::Unit を使ってテストを書いているのは少数派なのではないか、という想像 , Mac OSX 10.5.2でFirewireのスピ.. でみたネタを使ってみたら、何だかとても使いやすかったので、利用させていただいています。

ただ毎回、define_methodと書くのがめんどいので、こんな感じで使っています。

require 'test/unit'

class ArrayTest < Test::Unit::TestCase
  def self.expect(str_test, &blk)
    define_method("test_#{str_test}", &blk)
  end

  expect '一つ以上の要素が格納されている場合、#sizeは格納されている要素数を返すこと' do
    array = [11, 22, 33]
    assert_equal(3, array.size)
  end

  expect '要素が格納されていない場合、#sizeはnilを返すこと(うそてすと)' do
    array = []
    assert_equal(nil, array.size)
  end
end

実行させるとこう

Loaded suite array_test
Started
.F
Finished in 0.051861 seconds.

  1) Failure:
test_要素が格納されていない場合、#sizeはnilを返すこと(うそてすと)(ArrayTest) [array_test.rb:15]:
<nil> expected but was
<0>.

2 tests, 2 assertions, 1 failures, 0 errors

define_method!! define_method!!