2012-07-05 11 views
17

コマンドラインでruby sayhello.rbを実行してから、Hello from Rspecを受け取ります。RSpecコマンドラインへのテスト出力

私はこれをすることを持っている:私はUnixのように「

class Hello 
    def speak 
    puts 'Hello from RSpec' 
    end 
end 

hi = Hello.new #brings my object into existence 
hi.speak 

今、私は「RSpecのからこんにちは」をコマンドライン出力が実際にあることを確認するためにRSpecのテストを書きたい ありません"

NOT WORKING。私は現在、私のsayhello_spec.rbファイルにこれを持っています

require_relative 'sayhello.rb' #points to file so I can 'see' it 

describe "sayhello.rb" do 
    it "should say 'Hello from Rspec' when ran" do   
    STDOUT.should_receive(:puts).with('Hello from RSpec')  
    end 
end 

誰かが正しい方向に私を向けることができますか?

答えて

24

これはかなり良い方法です。

output = capture_stdout { Hello.new.speak } 
output.should == "Hello from RSpec\n" 
+2

この上に構築するには、次の デフexpect_stdout(文字列、およびブロック)。 出力= capture_stdout(&ブロック); 出力には文字列を含める必要があります。 終了 –

2

quietlyコマンドが何をしたい、おそらくです(activesupportのに調理、api.rubyonrails.orgでドキュメントを参照してください):このような

def capture_stdout(&block) 
    original_stdout = $stdout 
    $stdout = fake = StringIO.new 
    begin 
    yield 
    ensure 
    $stdout = original_stdout 
    end 
    fake.string 
end 

用途:hirb test_helper sourceからコピーされます。以下のRSpecコードのこのスニペットは、stdoutに出力がないことを確認し、同時にstdoutをサイレンシングする方法を示しています。

quietly do      # silence everything 
    commands.each do |c| 
    content = capture(:stderr) { # capture anything sent to :stderr 
     MyGem::Cli.start(c) 
    } 
    expect(content).to be_empty, "#{c.inspect} had output on stderr: #{content}" 
    end 
end 
-5
it "should say 'Hello from Rspec' when run" do   
    output = `ruby sayhello.rb` 
    output.should == 'Hello from RSpec' 
end 
関連する問題