ruby - Prueba de salida a línea de comando con RSpec
testing (3)
Aquí hay una manera bastante buena de hacer esto. Copiado de la fuente hirb test_helper :
def capture_stdout(&block)
original_stdout = $stdout
$stdout = fake = StringIO.new
begin
yield
ensure
$stdout = original_stdout
end
fake.string
end
Use así:
output = capture_stdout { Hello.new.speak }
output.should == "Hello from RSpec/n"
Lo que quiero hacer es ejecutar ruby sayhello.rb
en la línea de comandos, luego recibir Hello from Rspec
.
Lo tengo 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 rspec para verificar que la salida de la línea de comandos sea en realidad "Hola de RSpec" y no "Me gusta Unix"
NO FUNCIONA. Actualmente 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
¿Puede alguien apuntarme en la dirección correcta por favor?
El comando quietly
es probablemente lo que quieres (preparado en ActiveSupport, consulta los documentos en api.rubyonrails.org ). Este fragmento de código RSpec a continuación muestra cómo asegurarse de que no haya salida en stderr al mismo tiempo que se silencia 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
it "should say ''Hello from Rspec'' when run" do
output = `ruby sayhello.rb`
output.should == ''Hello from RSpec''
end