2015-04-01 36 views
4

我有一個應用程序,我想測試是否從我的記錄器得到正確的 消息。我得到如何使用MiniTest測試記錄儀信息?

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的和記錄器之間切換)。 我與Log4r::StderrOutputterLog4r::Outputter.stdout有類似的結果。

所以它看起來被髮送到輸出屏幕,但它並沒有在STDOUT或STDERR中被minitest捕獲。

在我開始寫MINITEST-log4r的寶石:

有測試在MINITEST記錄器輸出的可能性?


如果不是: 任何建議如何實現MINITEST-log4r的創業板?

例子我能想象:

  • 定義MINITEST新的輸出器(log4r的:: MinitestOutputter)
  • 模擬記錄儀。
  • 新的斷言(添加新的輸出器的參數?):
    • assert_message('INFO log: Hello World'){ @log.info("Hello World") }
    • assert_messages(:info => 1, :debug => 2){ @log.info("Hello World") }計數的消息。
    • assert_info_messages('Hello World'){ @log.info("Hello World") }
    • assert_debug_messages('Hello World'){ @log.info("Hello World") }

回答

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。測試結束後,輸出器再次被移除。

該寶石支持log4rlogger

1

您可以建立一個管道,從管道到記錄器通過作家,然後用閱讀器從管道來測試你的斷言。

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 = w.gets 
puts "Test passed: #{!!(/testing/ =~ output)}" 
+0

小字體在這裏。應該是'output = r.gets' – 2016-11-13 13:58:01