views:

72

answers:

2

I'm new to ruby so forgive me if this is simple or I get some terminology wrong.

I've got a bunch of unit tests (actually they're integration tests for another project, but they use ruby test/unit) and they all include from a module that sets up an instance variable for the log object. When I run the individual tests I'd like log.level to be debug, but when I run a suite I'd like log.level to be error. Is it possible to do this with the approach I'm taking, or does the code need to be restructured?

Here's a small example of what I have so far.

The logging module:

#!/usr/bin/env ruby

require 'logger'

module MyLog

  def setup
    @log = Logger.new(STDOUT)
    @log.level = Logger::DEBUG
  end
end

A test:

#!/usr/bin/env ruby

require 'test/unit'
require 'mylog'

class Test1 < Test::Unit::TestCase

  include MyLog

  def test_something
    @log.info("About to test something")
    # Test goes here
    @log.info("Done testing something")
  end
end

A test suite made up of all the tests in its directory:

#!/usr/bin/env ruby

Dir.foreach(".") do |path|
  if /it-.*\.rb/.match(File.basename(path))
    require path
  end
end
A: 

Hmm. I think the way to do it is to change the logging module to test an environment variable, say TEST_SUITE and set the logging level to info if it is set, and debug if it is not.

Then update your test suite to set the TEST_SUITE environment variable at the top, and unset it at the bottom.

Seems a bit clunky, so I'd be interested to see if anyone else has any other ideas.

stephenr
+1  A: 

As you noted you're going to need to set something in the suite. Something like the following can be used in the setup method. Just call MyLog.setInSuite in your suite and it'll set the level to INFO on setup.

module MyLog
  @@use_info = false

  def MyLog.setInSuite()
    @@use_info = true
  end

  def setup
    @log = Logger.new(STDOUT)
    if (@@use_info)
      @log.level = Logger::INFO
    else
      @log.level = Logger::DEBUG
    end
  end
end
Paul Rubel