¡Así se supone que funciona!
Cada prueba debe estar completamente aislada del resto, por lo que los métodos setup
y tear_down
se ejecutan una vez para cada caso de prueba. Sin embargo, hay casos en los que puede desear más control sobre el flujo de ejecución. Luego puede agrupar los casos de prueba en suites.
En su caso se podría escribir algo como lo siguiente:
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))
El TestDecorator
define una suite especial que proporciona un método setup
y tear_down
la que sólo se ejecutan una vez antes y después de la ejecución del conjunto de los Ensayos casos que contiene.
El inconveniente de esto es que debe indicar Prueba :: Unidad cómo ejecutar las pruebas en la unidad. En el caso de que su unidad contiene muchos casos de prueba y que necesita un decorador de sólo uno de ellos que necesita algo como esto:
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)
La documentación ofrece una buena explicación sobre cómo funcionan las suites.
dos métodos de ensayo con el mismo nombre conduce al primer método no se está ejecutando. Podrías poner un error en la primera prueba, y las pruebas aún pasarían. Un efecto secundario de la programación de cortar y pegar. –
Sí, y es fácil. Esto finalmente se implementa en TestUnit. Ver mi publicación waaaay en esta página. – jpgeek