run rails example describe ruby rspec rspec2

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.