ruby - rails - Prueba de salida STDOUT en Rspec
rspec example (2)
Estoy tratando de construir una especificación para esta declaración. Es fácil con ''puts''
print "''#{@file}'' doesn''t exist: Create Empty File (y/n)?"
RSpec 3.0+
RSpec 3.0 agregó una nueva matriz de output
para este propósito:
expect { my_method }.to output("my message").to_stdout
expect { my_method }.to output("my error").to_stderr
Minitest
Minitest también tiene algo llamado capture_io
:
out, err = capture_io do
my_method
end
assert_equals "my message", out
assert_equals "my error", err
RSpec <3.0 (y otros)
Para RSpec <3.0 y otros marcos, puede usar el siguiente helper. Esto le permitirá capturar lo que se envía a stdout y stderr, respectivamente:
require ''stringio''
def capture_stdout(&blk)
old = $stdout
$stdout = fake = StringIO.new
blk.call
fake.string
ensure
$stdout = old
end
def capture_stderr(&blk)
old = $stderr
$stderr = fake = StringIO.new
blk.call
fake.string
ensure
$stderr = old
end
Ahora, cuando tienes un método que debería imprimir algo a la consola
def my_method
# ...
print "my message"
end
puedes escribir una especificación como esta:
it ''should print "my message"'' do
printed = capture_stdout do
my_method # do your actual method call
end
printed.should eq("my message")
end
Si su objetivo es solo poder probar este método, lo haría así:
class Executable
def initialize(outstream, instream, file)
@outstream, @instream, @file = outstream, instream, file
end
def prompt_create_file
@outstream.print "''#{@file}'' doesn''t exist: Create Empty File (y/n)?"
end
end
# when executing for real, you would do something like
# Executable.new $stdout, $stdin, ARGV[0]
# when testing, you would do
describe ''Executable'' do
before { @input = '''' }
let(:instream) { StringIO.new @input }
let(:outstream) { StringIO.new }
let(:filename) { File.expand_path ''../testfile'', __FILE__ }
let(:executable) { Executable.new outstream, instream, filename }
specify ''prompt_create_file prompts the user to create a new file'' do
executable.prompt_create_file
outstream.string.should include "Create Empty File (y/n)"
end
end
Sin embargo, quiero señalar que no probaría un método como este directamente. En cambio, probaría el código que lo usa. Estuve hablando con un aprendiz potencial ayer, y él estaba haciendo algo muy similar, así que me senté con él y volvimos a implementar una parte de la clase, puedes ver eso here .
También tengo un blog que habla sobre este tipo de cosas.