Как сделать вывод RSpec на консоль при запуске в качестве команды% x [rspec] из сценария Ruby? - PullRequest
1 голос
/ 12 ноября 2011

У меня есть класс с методом экземпляра, который запускает RSpec с использованием записи %x[]:

class TestRunner
  def run_rspec
    # do stuff
    %x[rspec spec -c -f documentation]
    # do more stuff
  end
end

Когда я делаю это:

> tr = TestRunner.new
> tr.run_rspec

Документация (имена групп и примеров) не отображается в консоли.

Для сравнения, когда я запускаю rspec прямо из командной строки, я получаю это:

$ rspec spec -c -f documentation

  a group name
    an example
    another example
    ...

Я не хочу сделать это:

puts %x[rspec spec -c -f documentation

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

Есть ли способ, с моей установкой, заставить RSpec объявить, что он делает, как он это делает (как это происходит при обычном запуске из командной строки)?

1 Ответ

3 голосов
/ 14 ноября 2011

Мне сообщили, что system() и другие методы оболочки могут быть опасными для использования, поэтому я решил переключиться на еще лучший подход использования самого RSpec:

RSpec::Core::Runner.run(['spec', '-c', '-f', 'documentation'])

вместо того, чтобы вызывать его через shell из моего сценария Ruby.


Ruby предлагает несколько вариантов запуска программ из командной строки.Я использовал %x[], неправильный выбор для моего варианта использования.

Решение: Используйте system(), а не %x[] - rspec запишет STDOUT вв режиме реального времени, когда я вызываю его с помощью system('rspec spec').


Некоторые сведения, которые могут пригодиться всем, кто сталкивается с этим вопросом:

Рассмотрим различия между параметрами командной строки Ruby:

  • %x[command] накапливает результат command и возвращает его за один фрагмент.
  • exec('command') будет выдавать command при выполнении command, но будетзамените любой процесс, который его называет - т. е. если вы используете exec в своем скрипте Ruby, ваш скрипт Ruby не завершится.
  • system('command') выполняет command в подоболочке и возвращается к вызывающемускрипт.

Вот почему system был выбор для моего скрипта.

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