ruby - How can I test logger-messages with MiniTest? -


i have application , want test if correct messages logger.

a short example (you may switch between log4r , logger):

gem 'minitest' require 'minitest/autorun' require 'log4r' #~ require 'logger' class testlog < minitest::test   def setup     if defined? log4r       @log = log4r::logger.new('log')       @log.outputters << log4r::stdoutoutputter.new('stdout', :level => log4r::info)     else       @log = logger.new(stdout)       @log.level = logger::info     end   end    def test_silent     assert_silent{ @log.debug("hello world") }     assert_output(nil,nil){ @log.debug("hello world") }   end   def test_output     #~ refute_silent{ @log.info("hello") }#-> nomethoderror: undefined method `refute_silent'             assert_output("info log: hello world\n",''){ @log.info("hello world") }   end  end 

but get:

  1) failure: testlog#test_output [minitest_log4r.rb:27]: in stdout. expected: "info log: hello world\n"   actual: "" 

on output screen see message. have similar results log4r::stderroutputter , log4r::outputter.stdout.

so seems send output screen, not catched minitest in stdout or stderr.

before start write minitest-log4r-gem:

is there possibility test logger-output in minitest?


if not: recommendations how implement minitest-log4r-gem?

examples imagine:

  • define new outputter minitest (log4r::minitestoutputter)
  • mock logger.
  • new assertions (add new outputter parameter?):
    • assert_message('info log: hello world'){ @log.info("hello world") }
    • assert_messages(:info => 1, :debug => 2){ @log.info("hello world") } count messages.
    • assert_info_messages('hello world'){ @log.info("hello world") }
    • assert_debug_messages('hello world'){ @log.info("hello world") }

you can set pipe, pass writer pipe logger, , use reader pipe test assertions.

http://ruby-doc.org/core-2.1.0/io.html#method-c-pipe

something like:

require 'logger' r, w = io.pipe log = logger.new(w) log.info "testing info log message" output = w.gets puts "test passed: #{!!(/testing/ =~ output)}" 

Comments

Popular posts from this blog

javascript - AngularJS custom datepicker directive -

javascript - jQuery date picker - Disable dates after the selection from the first date picker -