RSpec

2012-07-05 26 views
17

ile komut satırı için test çıktısı yapmak istiyorum Komut satırında ruby sayhello.rb çalıştırmak, sonra Hello from Rspec almak.RSpec

Bununla o var:

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

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

Şimdi komut satırı çıktı aslında "RSpec dan Merhaba" ve olmadığını kontrol etmek RSpec bir test yazmak istiyorum "ben Unix gibi "

ÇALIŞMA". Şu anda benim sayhello_spec.rb dosyasında bu var

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 

birisi bana doğru yönde lütfen işaret edebilir?

cevap

24

İşte bunu yapmak için oldukça iyi bir yol. hirb test_helper source kopyalanmış:

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

Kullanım böyle:

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

bu üzerine inşa etmek için: def expect_stdout (dize, ve blok); output = capture_stdout (& block); output.should string içerir; end –

2

quietly komut istediğini muhtemelen (ActiveSupport içine pişmiş api.rubyonrails.org de dokümanlar bakınız). Aşağıdaki RSpec kodunun bu pasajı, stdout'u aynı anda susturan stderr'de herhangi bir çıkış olmadığından emin olunmasını gösterir.

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