【问题标题】:How can I test logger-messages with MiniTest?如何使用 MiniTest 测试记录器消息?
【发布时间】:2015-04-01 13:37:49
【问题描述】:

我有一个应用程序,我想测试我是否正确 来自我的记录器的消息。

一个简短的例子(你可以在 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

但我明白了:

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

在我的输出屏幕上,我看到了这条消息。 我对Log4r::StderrOutputterLog4r::Outputter.stdout 有类似的结果。

所以它似乎是发送到输出屏幕,但它没有被 STDOUT 或 STDERR 中的 minitest 捕获。

在我开始写一个 minitest-log4r-Gem 之前:

是否有可能在 minitest 中测试记录器输出?


如果不是: 关于如何实现 minitest-log4r-Gem 有什么建议吗?

我能想象的例子:

  • 为 minitest (Log4r::MinitestOutputter) 定义新的输出器
  • 模拟记录器。
  • 新断言(添加新输出器作为参数?):
    • assert_message('INFO log: Hello World'){ @log.info("Hello World") }
    • assert_messages(:info =&gt; 1, :debug =&gt; 2){ @log.info("Hello World") } 统计消息。
    • assert_info_messages('Hello World'){ @log.info("Hello World") }
    • assert_debug_messages('Hello World'){ @log.info("Hello World") }

【问题讨论】:

    标签: ruby unit-testing logging minitest log4r


    【解决方案1】:

    同时我创建了一个minitest-logger-Gem

    如何使用的代码示例:

    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
    

    在测试期间,一个临时输出器被添加到记录器@log。测试后输出器再次被移除。

    gem 支持log4rlogger

    【讨论】:

      【解决方案2】:

      您可以设置一个管道,将写入器从管道传递到记录器,然后使用管道中的读取器来测试您的断言。

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

      类似:

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

      【讨论】:

      • 这里的小错字。应该是output = r.gets
      【解决方案3】:

      @Puhlze 的回答很好。只是为了非阻塞,事先检查是否有可用的输入:

      if IO.select([r], [], [], 0.01).nil?
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-15
        • 2015-11-17
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多