que - Ejecutar Rspec desde Ruby
que es rspec (3)
Creo que la mejor manera sería usar la configuración de RSpec y el formateador. Esto no implicaría analizar la secuencia de IO, también ofrece una personalización de resultados mucho más rica mediante programación.
RSpec 2:
require ''rspec''
config = RSpec.configuration
# optionally set the console output to colourful
# equivalent to set --color in .rspec file
config.color = true
# using the output to create a formatter
# documentation formatter is one of the default rspec formatter options
json_formatter = RSpec::Core::Formatters::JsonFormatter.new(config.output)
# set up the reporter with this formatter
reporter = RSpec::Core::Reporter.new(json_formatter)
config.instance_variable_set(:@reporter, reporter)
# run the test with rspec runner
# ''my_spec.rb'' is the location of the spec file
RSpec::Core::Runner.run([''my_spec.rb''])
Ahora puede usar el objeto json_formatter
para obtener el resultado y el resumen de una prueba de especificaciones.
# gets an array of examples executed in this test run
json_formatter.output_hash
Un ejemplo de valor de output_hash
se puede encontrar here :
RSpec 3
require ''rspec''
require ''rspec/core/formatters/json_formatter''
config = RSpec.configuration
formatter = RSpec::Core::Formatters::JsonFormatter.new(config.output_stream)
# create reporter with json formatter
reporter = RSpec::Core::Reporter.new(config)
config.instance_variable_set(:@reporter, reporter)
# internal hack
# api may not be stable, make sure lock down Rspec version
loader = config.send(:formatter_loader)
notifications = loader.send(:notifications_for, RSpec::Core::Formatters::JsonFormatter)
reporter.register_listener(formatter, *notifications)
RSpec::Core::Runner.run([''spec.rb''])
# here''s your json hash
p formatter.output_hash
Otros recursos
Estoy tratando de ejecutar rspec desde ruby, y obtengo el estado o la cantidad de fallas de un método o algo así. En realidad estoy corriendo algo como esto:
system("rspec ''myfilepath''")
pero solo puedo obtener la cadena devuelta por la función. ¿Hay alguna manera de hacerlo directamente utilizando objetos?
Le sugiero que eche un vistazo al código fuente de rspec para encontrar la respuesta. Creo que puedes empezar con example_group_runner
Edit : Ok, aquí está el camino:
RSpec::Core::Runner::run(options, err, out)
Opciones - matriz de directorios, err y out - streams. Por ejemplo
RSpec::Core::Runner.run([''spec'', ''another_specs''], $stderr, $stdout)
Su problema es que está utilizando el método del Kernel#system
para ejecutar su comando, que solo devuelve verdadero o falso en función de si puede encontrar el comando y ejecutarlo con éxito. En su lugar, desea capturar la salida del comando rspec
. Esencialmente desea capturar todo lo que rspec genera en STDOUT. Luego puede iterar a través de la salida para encontrar y analizar la línea que le indicará cuántos ejemplos se ejecutaron y cuántos fallos hubo.
Algo a lo largo de las siguientes líneas:
require ''open3''
stdin, stdout, stderr = Open3.popen3(''rspec spec/models/my_crazy_spec.rb'')
total_examples = 0
total_failures = 0
stdout.readlines.each do |line|
if line =~ /(/d*) examples, (/d*) failures/
total_examples = $1
total_failures = $2
end
end
puts total_examples
puts total_failures
Esto debería generar la cantidad de ejemplos totales y la cantidad de fallas, adaptarse según sea necesario.