From: Eric Hodel Date: 2007-08-08T16:08:10+09:00 Subject: Re: capturing stdout during unit tests On Aug 7, 2007, at 20:59, Mark Slater wrote: > I've written a script for use with Nagios (a monitoring tool) that > I'd like to test. The requirements for the script is that it output > a single line of text to STDOUT and then exit with a status code (0 > - 3). My script is designed to monitor a few different services... > each invocation includes a required command line argument > specifying the service to monitor in the current invocation. To do > that, I created a class for each type of service monitor. > > I'm now writing unit tests for my script, and I'd like to check > that the output written to STDOUT by each service monitor class is > correct. But I'm new to Ruby and I'm not sure how to do that. In > other languages, I'd simply redefine STDOUT as a stream that goes > to a large in-memory buffer, but I haven't seen anything that > suggests that is possible in Ruby. The best I've come up with so > far is creating a temporary file and calling $stdout.reopen() with > the path to that temporary file. However, I'd much rather do this > in memory because then I never have to worry about what file system > and permissions the user executing the unit test has. Install the ZenTest gem, then: require 'test/zentest_assertions' class TestBlah < Test::Unit::TestCase def test_my_stuff out, err = util_capture do the_thing end assert_equal "...", out.string assert_equal "...", err.string end end -- Poor workers blame their tools. Good workers build better tools. The best workers get their tools to do the work for them. -- Syndicate Wars