[rspec-users] Can you control $stdout when specs are running?

David J. Hamilton groups at hjdivad.com
Wed Jan 12 12:29:08 EST 2011


Excerpts from Chuck Remes's message of Wed Jan 12 07:52:58 -0800 2011:
> I'd like to bump this message because I am facing a similar situation. 
> 
> What's a good technique for spec'ing code that prints to STDOUT yet keeps the spec output nice and clean?

I can't promise that what follows is a “good” technique for this, but it works
for me.  At the moment, I can't quite recall why this doesn't get in the way of
rspec's own output.

The stuff outside of the configure block is not strictly necessary, but helpful
if you want to be able to debug specs without the output of ruby-debug being
sent to your buffers.

  # spec/spec_helper.rb

  Rspec.configure do |c|
    # capture output
    @output         = ''
    @err            = ''
    $stdout.stub!( :write ) { |*args| @output.<<( *args )}
    $stderr.stub!( :write ) { |*args| @err.<<( *args )}
  end

  # Track original $stdout, $stderr write methods so we can restore them for
  # debugging

  class << $stdout
    alias_method :real_write, :write
  end
  class << $stderr
    alias_method :real_write, :write
  end


  class Object
    def debug
      # For debugging, restore stubbed write
      class << $stdout
        alias_method :write, :real_write
      end
      class << $stderr
        alias_method :write, :real_write
      end

      require 'ruby-debug'
      debugger
    end
  end


-- 
med vänlig hälsning
David J. Hamilton


More information about the rspec-users mailing list