我有一个带有实例方法的类,该方法使用%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宣布它正在做什么,就像它正在做的那样(正如从命令行正常运行时那样)?
答案 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}}的原因。