(1 つのテスト クラスだけでなく) テスト スイート全体のすべてのメソッドの前にセットアップを実行する最良の方法は何ですか?
Rspec を使用すると、グローバルな before および after ブロックを定義できます。モジュールを各テストクラスに混在させることを含まない、Test::Unit でこれを行うためのきれいな匹敵する方法はありますか?
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 でテスト済み。
パッチを適用してメソッド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