1

私は通常Javaプログラマーであることを認めることから始めましょうが、私はルビーを学ぼうとしています。

Ruby 1.9.3を使用していて、テストユニットgemをインストールしました(minitestを使用してテストスイートを作成する方法がわかりませんでした)。

同じAPIをサポートすることを目的とした2つのクラス(AとBと呼びます)がありますが、それらは異なるデータストア(議論のために、ファイルシステムとデータベース)によって支えられています。

それらは同じAPIをサポートしているので、テストの単一のコレクションを作成したいと思いますが、コレクションはクラスAとクラスBの両方に対して実行されます。

Javaでは、次の3つのテストクラスを作成します。

  • AbstractTest:すべてのテストメソッドを一覧表示し、実装がクラスAまたはクラスBのいずれかのインスタンスを返すことが期待される抽象メソッドgetTestee()を持ちます。各テストメソッドはgetTestee()を呼び出し、テストを実行します。オブジェクトが返されました。

  • ATest:AbstractTestを拡張し、クラスAのインスタンスを返すgetTestee()を実装します。

  • BTest:AbstractTestを拡張し、クラスBのインスタンスを返すgetTestee()を実装します。

ただし、rubyで同様のテストクラス階層を構築すると、テストフレームワークはATestやBTestではなくAbstractTestのインスタンスを作成するように見えます。AbstractTestはgetTestee()を定義していないので、

NoMethodError: undefined method `getTestee' for test_list(AbstractTest):AbstractTest

とにかく、私の同僚の1人が、AbstractTestクラスを再定義し、事後にgetTesteeメソッドを追加するように見える戦略を提案しました。何かのようなもの:

require 'tests/abstract_test'

require 'a'

class AbstractTest
  def getTestee
    A.new
  end
end

require 'tests/abstract_test'

require 'b'

class AbstractTest
  def getTestee
    B.new
  end
end

しかし、これは本当に私を混乱させ、コードの臭いのようです。現在、3つの異なるAbstractTestクラスがあり、TestSuite内でそれらを個別に参照する方法がないように感じます。

では、この状況でルビーが一般的に受け入れているテスト方法は何ですか?

ピーター。

4

1 に答える 1

2

私が行うことは、実行するすべてのテストを含む基本モジュールを作成してから、派生クラスのオブジェクトを初期化することです。このようなもの(Rubyの組み込みTest :: Unitライブラリを使用):

module Testers
  def test_something
    assert_equal "expected result", @myobject.function_call
  end

  # ....
end

その後、実際のテストクラスで:

require 'test/unit'

class TestA < Test::Unit::TestCase
  def setup
    @myobject = A.new
  end

  include Testers
end

class TestB < Test::Unit::TestCase
  def setup
    @myobject = B.new
  end

  include Testers
end

ここでの魔法は、ミックスイン(との組み合わせ)を使用するmoduleinclude、実際に多重継承を行わなくても、多重継承の優れた側面のいくつかを利用できることです。

于 2012-07-03T19:01:47.170 に答える