如何使用 MiniTest 测试记录器消息?
How can I test logger-messages with MiniTest?
我有一个应用程序,我想测试我是否正确
来自我的记录器的消息。
一个简短的例子(你可以在 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::StderrOutputter
和 Log4r::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 => 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") }
您可以设置管道,将写入器从管道传递到记录器,然后使用管道中的 reader 来测试您的断言。
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)}"
同时我创建了一个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
。测试后再次移除输出器。
@Puhlze 回答的不错。仅针对 non-blocking,请事先检查是否有可用的输入:
if IO.select([r], [], [], 0.01).nil?
我有一个应用程序,我想测试我是否正确 来自我的记录器的消息。
一个简短的例子(你可以在 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::StderrOutputter
和 Log4r::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 => 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") }
您可以设置管道,将写入器从管道传递到记录器,然后使用管道中的 reader 来测试您的断言。
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)}"
同时我创建了一个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
。测试后再次移除输出器。
@Puhlze 回答的不错。仅针对 non-blocking,请事先检查是否有可用的输入:
if IO.select([r], [], [], 0.01).nil?