How to check test messages using MiniTest?

I have an application and I want to check if I have messages from my registrar correctly.

A brief example (you can switch between log4r and 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 I get:

  1) Failure: Testlog#test_output [minitest_log4r.rb:27]: In stdout. Expected: "INFO log: Hello World\n" Actual: "" 

On my output screen, I see a message. I have similar results with Log4r::StderrOutputter and Log4r::Outputter.stdout .

So it seems that it is being sent to the output screen, but it is not caught by minitest in STDOUT or STDERR.

Before you start writing minitest-log4r-Gem:

Is it possible to test log output in minitest?


If not: Any recommendations for implementing a mini-log-log4r-gem?

Examples I could imagine:

  • define a new output for minitest (Log4r :: MinitestOutputter)
  • Wash the recorder.
  • new statements (add new output as parameter?):
    • assert_message('INFO log: Hello World'){ @log.info("Hello World") }
    • assert_messages(:info => 1, :debug => 2){ @log.info("Hello World") } for counting messages.
    • assert_info_messages('Hello World'){ @log.info("Hello World") }
    • assert_debug_messages('Hello World'){ @log.info("Hello World") }
+4
source share
2 answers

At the same time, I created minitest-logger-Gem

Sample code on how to use it:

 require 'log4r' require 'minitest-logger' class Test_log4r < MiniTest::Test def setup @log = Log4r::Logger.new('log') @log.level = Log4r::INFO end def test_output_1 assert_log(" INFO log: Hello World\n"){ @log.info("Hello World") } end def test_output_regex assert_log(/Hello World/){ @log.info("Hello World") } end def test_silent assert_silent_log(){ @log.debug("Hello World") #~ @log.info("Hello World") #uncomment this to see a failure } refute_silent_log(){ @log.warn("Hello World") #comment this to see a failure } end end 

During the test, a temporary output is added to the @log . After the test, the output is again deleted.

The gem supports log4r and logger .

+1
source

You can configure the channel, transfer the recorder from the channel to the recorder, and then use the reader from the channel to verify your claims.

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

Sort of:

 require 'logger' r, w = IO.pipe log = Logger.new(w) log.info "testing info log message" output = r.gets puts "Test passed: #{!!(/testing/ =~ output)}" 
+1
source

Source: https://habr.com/ru/post/1210164/


All Articles