あまり信頼していないコードの単体テストを行うときは、通常、次のパターンを使用します。
- 関数の出力に対する期待の多く(おそらく数十)を考えてください(これらは、コードがどのように機能するかについての「理論」と考えています)。
- 何千ものオブジェクトをスピンアップします。
- コードがどのように機能するかについての私の期待を反映して、私がコード化した数十のアサーションを介して各オブジェクトを実行します。
RubyのTest::Unit(私は初めてです)では、次のようなことをしています。
class TestFooBarrer < Test::Unit::TestCase
def setup
@lots_of_objects_to_be_tested = FooBarrer.bar_lots_of_foos
end
def assert_foo_has_been_barred(foo)
assert_kind_of Bar, foo
end
def assert_foo_has_baz_method(foo)
assert_respond_to foo, :baz
end
#Many more assertions along those lines go here.
def test_all_theories
@lots_of_objects_to_be_tested.each do |foo|
assert_foo_has_been_barred(foo)
assert_foo_has_baz_method(foo)
# etc.
#
end
end
end
私がテストしている理論の数が数十にある場合、これは明らかに少し扱いにくくなり、多くの不必要な繰り返しのように見えるものが含まれます。私はこのようなことをしたいと思います:
class FooTheories
def self.assert_all_theories(foo)
# ???
end
def assert_foo_has_been_barred(foo)
assert_kind_of Bar, foo
end
def assert_foo_has_baz_method(foo)
assert_respond_to foo, :baz
end
#Many more assertions along those lines go here.
end
class TestFooBarrer < Test::Unit::TestCase
def setup
@lots_of_objects_to_be_tested = FooBarrer.bar_lots_of_foos
end
def test_all_theories
@lots_of_objects_to_be_tested.each do |foo|
FooTheories.assert_all_theories(foo)
end
end
end
基本的に、私は1つの場所に多数のアサーションを記述し、それらを大量のオブジェクトに対して何度も呼び出す方法を探しています。
Rubyでそのようなもののサポートはありますか?私は特にTest::Unitに縛られていません。どのテストフレームワークでも問題ありません。