アプリケーションがあり、ロガーから正しいメッセージが得られるかどうかをテストしたいと考えています。
簡単な例 (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-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") }