Stuart
Stuart

Reputation: 575

How can I change ruby log level in unit tests based on context

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

Upvotes: 1

Views: 1256

Answers (2)

Paul Rubel
Paul Rubel

Reputation: 27222

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

Upvotes: 1

stephenr
stephenr

Reputation: 1173

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.

Upvotes: 0

Related Questions