2011-11-11 27 views
1

我有運行RSpec的使用%x[]符號實例方法的類:從Ruby腳本作爲命令%x [rspec]運行時,如何使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

你試過[open3](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3)的東西嗎? –

回答

3

我被告知,system()和其他殼的方法可能是危險的使用,所以我選擇切換到使用的RSpec本身的偶數更好的方法:

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

,而不是調用它通過我的Ruby腳本的shell。


Ruby提供了幾個用於從命令行運行程序的選項。我正在使用%x[],這是我用例的錯誤選擇。

解決方案:使用system(),不%x[] - rspec將寫信給STDOUT時,我把它與system('rspec spec')實時性。


的情況下,一些背景知識是有幫助的人誰在這個問題絆倒:

考慮Ruby的命令行選項之間的差異:

  • %x[command]積累的command結果並返回,在一個大塊。
  • exec('command')將輸出commandcommand運行,但將取代一切過程稱之爲 - 即,如果你在你的Ruby腳本中使用exec,你的Ruby腳本將無法完成。
  • system('command')在子shell中執行command,並返回到調用腳本。

這就是爲什麼system是我的腳本的選擇。

相關問題