2012-07-05 14 views
17

के साथ कमांड लाइन के लिए टेस्ट आउटपुट मैं कमांड लाइन पर ruby sayhello.rb चला रहा हूं, फिर Hello from Rspec प्राप्त करें।आरएसपीसी

मुझे लगता है कि मिल गया है इस के साथ:

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

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

अब मैं जाँच करने के लिए कमांड लाइन उत्पादन वास्तव में "RSpec से नमस्ते" और नहीं rspec में एक परीक्षण लिखना चाहते हैं "मैं यूनिक्स की तरह "

काम नहीं कर रहा है। मैं वर्तमान में मेरे 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

यह करने के लिए यहां एक बहुत अच्छा तरीका है। hirb test_helper source से नकल: इस तरह

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

उपयोग:

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

इस पर निर्माण करने के लिए: डीईएफ़ expect_stdout (स्ट्रिंग, और ब्लॉक); आउटपुट = capture_stdout (और ब्लॉक); output.sh स्ट्रिंग शामिल हो सकता है; अंत –

2

quietly आदेश शायद तुम क्या चाहते है (ActiveSupport में पकाया जाता है, api.rubyonrails.org पर डॉक्स देखें)। नीचे आरएसपीईसी कोड का यह स्निपेट दिखाता है कि कैसे सुनिश्चित किया जाए कि stdr पर कोई आउटपुट नहीं है जबकि साथ ही 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