2012-07-05 23 views
17

Quiero hacer es ejecutar ruby sayhello.rb en la línea de comandos, luego recibir Hello from Rspec.Prueba de salida a la línea de comando con RSpec

Tengo que con esto:

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

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

Ahora quiero escribir una prueba en la rspec para comprobar que la salida de línea de comandos es, de hecho, "Hola desde RSpec" y no "me gusta Unix "

NO FUNCIONA. En este momento tengo esto en mi archivo 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 

Alguien me puede apuntar en la dirección correcta, por favor?

Respuesta

24

Aquí hay una forma bastante buena de hacerlo. Copiado del 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 

uso como esto:

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

Para aprovechar este: def expect_stdout (cadena, y bloque); output = capture_stdout (y bloque); output.should string; final –

2

El comando quietly es probablemente lo que quiere (cocinado en ActiveSupport, ver documentos en api.rubyonrails.org). Este fragmento del código RSpec a continuación muestra cómo garantizar que no haya salida en stderr mientras silencia a la salida estándar.

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 
Cuestiones relacionadas