当从Ruby脚本作为命令%x [rspec]运行时,如何将RSpec输出到控制台?

时间:2011-11-11 23:22:56

标签: ruby rspec

我有一个带有实例方法的类,该方法使用%x[]表示法运行RSpec:

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 个答案:

答案 0 :(得分:3)

我被告知system()和其他shell方法使用起来很危险,所以我选择转用更好的方法来使用RSpec本身:

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

而不是从我的Ruby脚本中通过shell调用它。


Ruby提供了几种从命令行运行程序的选项。我正在使用%x[],这是我用例的错误选择。

解决方案:使用system(),而不是%x[] - rspec会在STDOUT调用system('rspec spec')时实时写入%x[command] {1}}。


有些背景可以帮助任何偶然发现这个问题的人:

考虑Ruby的命令行选项之间的差异:

  • command累积exec('command')的结果并将其返回到一个块中。
  • command会在command运行时输出exec,但会替换任何称为它的进程 - 即,如果您在Ruby脚本中使用system('command'),那么您的Ruby脚本不会完成。
  • command在子shell中执行system,然后返回到调用脚本。

这就是为我的脚本选择{{1}}的原因。