[英]How can I make RSpec output to console when run as a command %x[rspec] from Ruby script?
我有一个类使用%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宣布其运行状况(如在命令行中正常运行时所做的一样)?
我被告知system()
和其他shell方法可能很危险,所以我选择转向使用RSpec本身的更好的方法:
RSpec::Core::Runner.run(['spec', '-c', '-f', 'documentation'])
而不是从我的Ruby脚本中通过shell调用它。
Ruby提供了几种从命令行运行程序的选项。 我使用的是%x[]
,这是我用例的错误选择。
解决方案:使用system()
而不是%x[]
-当我使用system('rspec spec')
调用rspec
它将实时写入STDOUT
。
一些背景知识,以防偶然发现此问题的任何人:
考虑Ruby的命令行选项之间的差异:
%x[command]
累积的结果command
并返回,在一个组块。 exec('command')
将在command
运行时输出command
,但将替换任何称为它的进程 - 即,如果在Ruby脚本中使用exec
,则Ruby脚本将无法完成。 system('command')
在子shell中执行command
,并返回到调用脚本。 这就是为什么system
是我的脚本的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.