Выполнить Rspec от Ruby - PullRequest
       3

Выполнить Rspec от Ruby

18 голосов
/ 08 августа 2011

Я пытаюсь выполнить rspec из ruby ​​и получить статус или количество сбоев из метода или чего-то подобного.На самом деле я запускаю что-то вроде этого:

system("rspec 'myfilepath'")

, но я могу только получить строку, возвращаемую функцией.Есть ли способ сделать это напрямую, используя объекты?

Ответы [ 4 ]

26 голосов
/ 02 мая 2012

Я думаю, что лучшим способом было бы использование конфигурации RSpec и Formatter. Это не потребует синтаксического анализа потока ввода-вывода, а также дает гораздо более богатую настройку результатов программно.

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'])

Теперь вы можете использовать объект json_formatter, чтобы получить результат и сводку спецификации теста.

# gets an array of examples executed in this test run
json_formatter.output_hash

Пример значения output_hash можно найти здесь :

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

Другие ресурсы

8 голосов
/ 08 августа 2011

Я предлагаю вам взглянуть на исходный код rspec, чтобы узнать ответ.Я думаю, что вы можете начать с example_group_runner

Edit : Хорошо, вот способ:

RSpec::Core::Runner::run(options, err, out)

Опции - массив каталогов, ошибки &вне - потоки.Например

RSpec::Core::Runner.run(['spec', 'another_specs'], $stderr, $stdout) 
1 голос
/ 09 августа 2011

Ваша проблема в том, что вы используете метод Kernel#system для выполнения вашей команды, который возвращает только true или false в зависимости от того, сможет ли он найти команду и выполнить ее успешно.Вместо этого вы хотите захватить вывод команды rspec.По сути, вы хотите захватить все, что rspec выводит в STDOUT.Затем вы можете перебрать выходные данные, чтобы найти и проанализировать строку, которая скажет вам, сколько примеров было выполнено и сколько было сбоев.

Что-то в следующих строках:

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

Это должно вывести количество полных примеров и количество сбоев - адаптируйте при необходимости.

0 голосов
/ 13 июня 2019

Этот выводит на консоль и в то же время записывает сообщение.Formatter.stop - просто функция-заглушка, я не знаю, для чего она обычно, мне пришлось включить ее, чтобы использовать DocumentationFormatter.Также вывод форматера содержит коды раскраски консоли.

formatter = RSpec::Core::Formatters::DocumentationFormatter.new(StringIO.new)
def formatter.stop(arg1)
end
RSpec.configuration.reporter.register_listener(formatter, :message, :dump_summary, :dump_profile, :stop, :seed, :close, :start, :example_group_started)

RSpec::Core::Runner.run(['test.rb','-fdocumentation'])

puts formatter.output.string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...