ruby - rails - minitest spec
Antes/Después de Suite cuando usa Ruby MiniTest (8)
¿Existe una alternativa a RSpec''s before(:suite)
y after(:suite)
en MiniTest?
Sospecho que un corredor de prueba personalizado está en orden, sin embargo, no puedo imaginar que no sea un requisito común, por lo que probablemente alguien lo haya implementado en :-)
Como se indicó anteriormente en las respuestas y comentarios de MiniTest::Unit
, MiniTest::Unit
contiene la función after_tests
. No hay before_tests
o equivalentes, pero cualquier código en su archivo minitest_helper.rb
debe ejecutarse antes del banco de pruebas, por lo que hará la oficina de dicha función.
Advertencia: Todavía es relativamente nuevo en Ruby, y muy nuevo en Minitest, así que si me equivoco, ¡corrígeme! :-)
Hay métodos setup()
y de teardown()
disponibles. La documentación también muestra before()
y after()
como disponibles.
Editar: ¿Está buscando ejecutar algo antes de cada prueba o antes o después de que todo el conjunto esté terminado?
Lo bueno de minitest es su flexibilidad. He estado usando un MiniTest Runner personalizado con una devolución de llamada + before_suite +. Algo como en este ejemplo: configuración de Ruby Minitest: Suite o nivel de clase?
Y luego dile a minitest que use el corredor personalizado
MiniTest::Unit.runner = MiniTestSuite::Unit.new
Para ejecutar el código antes de cada prueba, use before
. Estás operando aquí en el contexto de una instancia, posiblemente de una clase generada implícitamente por describe
, por lo que las variables de instancia establecidas en before
son accesibles en cada prueba (por ejemplo, dentro de un bloque).
Para ejecutar el código antes de todas las pruebas, simplemente ajuste las pruebas en una clase, una subclase de MiniTest::Spec
o lo que sea; ahora, antes de las pruebas en sí, puede crear una clase o módulo, establecer variables de clase, llamar a un método de clase, etc., y todo eso estará disponible en todas las pruebas.
Ejemplo:
require "minitest/autorun"
class MySpec < MiniTest::Spec
class MyClass
end
def self.prepare
puts "once"
@@prepared = "prepared"
@@count = 0
end
prepare
before do
puts "before each test"
@local_count = (@@count += 1)
end
describe "whatever" do
it "first" do
p MyClass
p @@prepared
p @local_count
end
it "second" do
p MyClass
p @@prepared
p @local_count
end
end
end
Aquí está la salida, junto con mis comentarios entre llaves explicando lo que cada línea del resultado prueba:
once [this code, a class method, runs once before all tests]
Run options: --seed 29618 [now the tests are about to run]
# Running tests:
before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
1 [the instance variable from the before block is visible in each test]
before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
2 [the instance variable from the before block is visible each test]
(Tenga en cuenta que no me refiero a que este resultado implique ninguna garantía sobre el orden en que se ejecutarán las pruebas).
Otro enfoque es utilizar el código existente before
pero ajustar para ejecutar solo una vez en un indicador de variable de clase. Ejemplo:
class MySpec < MiniTest::Spec
@@flag = nil
before do
unless @@flag
# do stuff here that is to be done only once
@@flag = true
end
# do stuff here that is to be done every time
end
# ... tests go here
end
Para que esto funcione con la versión actual de Minitest (5.0.6) necesita require ''minitest''
y usar Minitest.after_run { ... }
.
warn "MiniTest::Unit.after_tests is now Minitest.after_run. ..."
https://github.com/seattlerb/minitest/blob/master/lib/minitest.rb https://github.com/seattlerb/minitest/blob/master/lib/minitest/unit.rb
Puedes simplemente colocar el código fuera de la clase.
Esto es lo que hago para tener un estandarte.
require ''selenium-webdriver''
require ''minitest/test''
require ''minitest/autorun''
class InstanceTest < Minitest::Test
def setup
url = ARGV.first
@url = self.validate_instance(url)
@driver = Selenium::WebDriver.for :firefox
end
También puede agregar una devolución de llamada de prueba después de actualizar su test_helper.rb (o spec_helper.rb) como este
# test_helper.rb
class MyTest < Minitest::Unit
after_tests do
# ... after test code
end
end
Una forma simple de hacer esto es escribir un método de clase protegido, y luego llamarlo en un begin
.
Un ejemplo de Minitest :: Spec:
describe "my stuff" do
def self.run_setup_code
if @before_flag.nil?
puts "Running the setup code"
@before_flag = true
end
end
before do
self.class.run_setup_code
end
it "will only run the setup code once" do
assert_equal 1, 1
end
it "really only ran it once" do
assert_equal 1,1
end
end
...Llegar
Run options: --seed 11380
# Running:
Running the setup code
..
Finished in 0.001334s, 1499.2504 runs/s, 1499.2504 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips