spec rails ruby test-suite minitest

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



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