1

非常によく似たクラスを定義するrubyファイル(、、)がいくつかありa.rbますb.rbc.rb(彼らは同じことをテストする必要があります)

これらのサブクラスをテストするための単体テストを作成し、各クラスのコンテキストをプログラムで生成しました(以下を参照)。代わりに、プログラムでテストクラス全体を作成する必要がありますか?もしそうなら、なぜそしてどのように?

単体テスト拡張機能を使用しているshouldaので、ファイルは次のようになります。

a.rb

class ItsA
  def number
    1123
  end
end

すぐに戻る

class ItsB
  def number
    6784
  end
end

test_letters.rb

require 'rubygems'
require 'test/unit'
require 'shoulda'

class LettersTest < Test::Unit::TestCase
  Dir.glob('letters/*.rb') do |letter|
    context "The #{letter} letter file"
      setup do
        # Here I require the ruby file and allocate
        # @theclass to be an instance of the class in the file.
        # I'm actually testing JavaScript using Harmony, but 
        # putting those details in might complicate my question.
      end

      should "return a number" do
        assert @theclass.number.is_a? Number
      end
    end
  end

これはかなりうまく機能しますが、代わりに他のジゲリーポケリーを実行して、自動的に作成などを行う必要がありますLetterATestLetterBTest?もしそうなら、あなたはそれをどのように行いますか、そしてその理由は何ですか?

4

1 に答える 1

1

これは、クラスがどの程度類似しているかに大きく依存しますが、クラスがほぼ同一であり、いくつかの小さなテストが必要であり、shoulda を使用していると仮定すると、次のようにすることができます。

class LettersTest < Test::Unit::TestCase
  context "The letter classes"
    setup do
      @instances = # your code to get a list of the instances
    end

    should "return a number" do
      @instances.each do |instance|
        assert instance.number.is_a?(Number), "#{instance.class}.number should be a number"
      end
    end
  end
end

私たちのコードベースでは、自動生成されたコンテキストとテストが多数あると、テストの実行がかなり遅くなることがわかったので、コンテキスト/テストの数を最小限に抑えるために上記のアプローチを採用しています。この問題は発生していない可能性があります。

于 2010-08-24T21:39:31.153 に答える