私は通常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内でそれらを個別に参照する方法がないように感じます。
では、この状況でルビーが一般的に受け入れているテスト方法は何ですか?
ピーター。