Вот как это должно работать!
Каждый тест должен быть полностью изолирован от остальных, поэтому методы setup
и tear_down
выполняются один раз для каждого теста. Однако существуют случаи, когда вам может потребоваться больший контроль над потоком выполнения. Затем вы можете сгруппировать тестовые наборы в suite .
В вашем случае вы могли бы написать что-то вроде следующего:
require 'test/unit'
require 'test/unit/ui/console/testrunner'
class TestDecorator < Test::Unit::TestSuite
def initialize(test_case_class)
super
self << test_case_class.suite
end
def run(result, &progress_block)
setup_suite
begin
super(result, &progress_block)
ensure
tear_down_suite
end
end
end
class MyTestCase < Test::Unit::TestCase
def test_1
puts "test_1"
assert_equal(1, 1)
end
def test_2
puts "test_2"
assert_equal(2, 2)
end
end
class MySuite < TestDecorator
def setup_suite
puts "setup_suite"
end
def tear_down_suite
puts "tear_down_suite"
end
end
Test::Unit::UI::Console::TestRunner.run(MySuite.new(MyTestCase))
TestDecorator
определяет специальный набор, который предоставляет методы setup
и tear_down
, которые запускаются только один раз до и после запуска набора тестовых наборов, которые он содержит.
Недостатком этого является то, что вам нужно указать Test :: Unit , как запускать тесты в модуле. Если в вашем модуле много тест-кейсов, и вам нужен декоратор только для одного из них, вам понадобится что-то вроде этого:
require 'test/unit'
require 'test/unit/ui/console/testrunner'
class TestDecorator < Test::Unit::TestSuite
def initialize(test_case_class)
super
self << test_case_class.suite
end
def run(result, &progress_block)
setup_suite
begin
super(result, &progress_block)
ensure
tear_down_suite
end
end
end
class MyTestCase < Test::Unit::TestCase
def test_1
puts "test_1"
assert_equal(1, 1)
end
def test_2
puts "test_2"
assert_equal(2, 2)
end
end
class MySuite < TestDecorator
def setup_suite
puts "setup_suite"
end
def tear_down_suite
puts "tear_down_suite"
end
end
class AnotherTestCase < Test::Unit::TestCase
def test_a
puts "test_a"
assert_equal("a", "a")
end
end
class Tests
def self.suite
suite = Test::Unit::TestSuite.new
suite << MySuite.new(MyTestCase)
suite << AnotherTestCase.suite
suite
end
end
Test::Unit::UI::Console::TestRunner.run(Tests.suite)
Документация Test :: Unit предоставляет хорошее объяснение того, как работают комплекты.