21

(1 つのテスト クラスだけでなく) テスト スイート全体のすべてのメソッドの前にセットアップを実行する最良の方法は何ですか?

Rspec を使用すると、グローバルな before および after ブロックを定義できます。モジュールを各テストクラスに混在させることを含まない、Test::Unit でこれを行うためのきれいな匹敵する方法はありますか?

4

2 に答える 2

24

Railsを使用していると仮定します。test/test_helper.rbファイルに以下を追加するだけです。

class ActiveSupport::TestCase
  setup :global_setup

  def global_setup
    #stuff to run before _every_ test.
  end
end

Rails 3.0.9 でテスト済み。

于 2011-08-16T11:10:18.830 に答える
7

パッチを適用してメソッドTest::Unit::TestCaseを定義するだけです。setup

class Test::Unit::TestCase
  def setup
    puts 'in setup'
  end
end

そして、サブクラスはデフォルトでこれを使用します。

class FooTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

class BarTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

テストケースに独自の設定が必要な場合は、super最初に呼び出して、グローバル設定が実行されることを確認する必要があります。

class BazTest < Test::Unit::TestCase
  def setup
    super
    puts 'custom setup'
  end

  def test_truth
    assert true
  end
end

グローバルセットアップを行うことは本当にあなたがしなければならないことですか、それともヘルパーメソッドを定義してTest::Unit::TestCaseそれを必要とするテストでそれを呼び出すことは役に立ちますか?ヘルパーメソッドのアプローチは、私のプロジェクトで有益だと思うものです。セットアップの状態と意図は、個々のテストごとに明確であり、「隠された」セットアップメソッドを見つけるために飛び回る必要はありません。多くの場合、グローバルセットアップは、デザインの一部を再考する必要があることを示すコードの臭いですが、YMMVです。

アップデート

ActiveSupportを使用しているので、テストケースでメソッドsuperを定義するたびに呼び出す必要のないものを最初に突き刺します。別のメソッドを呼び出す必要があり、開発者はテストケースでsetup独自のメソッドを定義するだけで、この変更を無効にすることができるため、それがどれほど価値があるかはわかりません。setupここにあります:

require 'rubygems'
require 'test/unit'
require 'active_support'
require 'active_support/test_case'

class ActiveSupport::TestCase

  def setup_with_global
    puts 'In Global setup'
    setup_without_global
  end

  alias_method_chain :setup, :global

end

class FooTest < ActiveSupport::TestCase

  def setup_without_global
    puts 'In Local setup'
  end

  def test_truth
    assert true
  end

end
于 2009-11-15T11:05:09.070 に答える