Say I''m testing a controller with rspec, and I have logger.debug and logger.error calls. Normally I''d like them to write to the appropriate file, but in this case I''d like to see the output on STDOUT. Is there an easy way to redirect logging in rspec to do this? I''m thinking that controller.should_receive(:logger).and_return(logger) should start it off, but then how do I get the new logger to do puts without defining a new class? I''m assuming there must be a "Ruby way" to do it. Will.
On 1/30/08, Will Sargent <will.sargent at gmail.com> wrote:> Say I''m testing a controller with rspec, and I have logger.debug and > logger.error calls. > > Normally I''d like them to write to the appropriate file, but in this > case I''d like to see the output on STDOUT. > > Is there an easy way to redirect logging in rspec to do this? > > I''m thinking that > > controller.should_receive(:logger).and_return(logger) > > should start it off, but then how do I get the new logger to do puts > without defining a new class? I''m assuming there must be a "Ruby way" > to do it.I''d think that controller.should_receive!(:logger).and_return(Logger.new(STDOUT)) should do it. Not sure whether or not you really want to use stub! vs. should_receive here, do you really want to require that logger be called or just allow it? Also if you want to set expectations on what''s actually logged you might want to do @log_stream = StringIO.new controller.stub!(:logger) and_return(Logger.new(@logstream)) and then get at the log output via something like @log_stream.string -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/
> > controller.should_receive(:logger).and_return(logger) > > > > should start it off, but then how do I get the new logger to do puts > > without defining a new class? I''m assuming there must be a "Ruby way" > > to do it. > > I''d think that > controller.should_receive!(:logger).and_return(Logger.new(STDOUT)) > should do it. > > Not sure whether or not you really want to use stub! vs. > should_receive here, do you really want to require that logger be > called or just allow it?Good question. I think there are cases where I might want either or both, depending on whether it''s for debugging or for support purposes.> Also if you want to set expectations on what''s actually logged you > might want to do > > @log_stream = StringIO.new > controller.stub!(:logger) and_return(Logger.new(@logstream)) > and then get at the log output via something like @log_stream.stringGreat -- that''s exactly what I need. Thank you. Will.