ruby testing rspec

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