2011-11-11 12 views
1

私は%x[]表記使ってRSpecのを実行しているインスタンスメソッドを持つクラスがあります:私はこれを行うと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 

文書(グループおよび例名前が)には表示されません。コンソール。その後、出力ため

puts %x[rspec spec -c -f documentation 

すべて:

$ rspec spec -c -f documentation 

    a group name 
    an example 
    another example 
    ... 

私はがこれを行うにはしたくない:私はまっすぐに私はこれを取得、コマンドラインからrspecを実行すると、コントラスト

非常に最後の1つの大きな塊に吐き出される。私はそれが "実時間"で実行されることを望んでおり、それぞれのテストが実行されるごとに各例が表示されます。

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スクリプトからシェルを介して。


Rubyには、コマンドラインからプログラムを実行するためのいくつかのオプションがあります。私は%x[]を使用していましたが、私のユースケースに間違った選択です。

ソリューション:使用system()、ない%x[] - 私はsystem('rspec spec')とそれを呼び出すときrspecがリアルタイムでSTDOUTに書き込みます。


いくつかのバックグラウンド場合には、それはこの質問時につまずく誰にも便利です。

は、Rubyのコマンドラインオプションの違いを考えてみましょう:

  • %x[command]commandの結果を蓄積し、それを返します。 1つのチャンク内にある。
  • exec('command')意志出力commandcommandとして実行されますが、それと呼ばれるものは何でもプロセス置き換えます - あなたがあなたのRubyスクリプトでexecを使用している場合、すなわち、あなたのRubyスクリプトは終了しません。
  • system('command')はサブシェルでcommandを実行し、呼び出し元のスクリプトに戻ります。

これは私のスクリプトのためにsystemが選択された理由です。

関連する問題