1

あまり信頼していないコードの単体テストを行うときは、通常、次のパターンを使用します。

  1. 関数の出力に対する期待の多く(おそらく数十)を考えてください(これらは、コードがどのように機能するかについての「理論」と考えています)。
  2. 何千ものオブジェクトをスピンアップします。
  3. コードがどのように機能するかについての私の期待を反映して、私がコード化した数十のアサーションを介して各オブジェクトを実行します。

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に縛られていません。どのテストフレームワークでも問題ありません。

4

1 に答える 1

1

私がすることは、その場でテストを生成することです。test_helperにメソッドを追加します。

def test(obj, &block)
  define_method("test_#{ obj.to_s }", &block)
end

そして、次のようにテストスイートを作成できます

class TestObjects < Test::Unit::TestCase

  @objects_to_test = [...]

  @objects_to_test.each do |obj|
    test obj do

      assert obj.is_a?(Foo), 'not a foo'

      # all assertions here

    end
  end

end

そして、失敗した場合、テストの名前はオブジェクトの文字列表現であるため、どのオブジェクトが失敗したかを知ることができます。例:メッセージ:

1) Failure:
test_#<Bar:0x000001009ee930>(TestObjects):
not a foo
于 2013-02-15T19:57:54.180 に答える