1

Ruby の初心者で、Mini Test と log4r で遊んで、ラッパー クラスを作成しようとしています。

次のエラーが発生します。

Run options: --seed 18181

# Running tests:

E

Finished tests in 0.015625s, 63.9996 tests/s, 0.0000 assertions/s.

  1) Error:
test_debug_messages(TestLogger):
NameError: uninitialized constant Logger
    /home/jamlopez/scripts/Yatra.Next/rpm_framework/lib/rpm/core/logger.rb:7:in `initialize'
    logger.rb:6:in `new'
    logger.rb:6:in `setup'

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

クラスは次のとおりです。

require 'log4r'

# RPM Framework Logger
# Based on and utilizing log4r >= 1.1.10
class RPMLogger
    def initialize
        @log = ::Logger.new 'log'
        @log.outputters = Outputter.stdout
        @logfile_location = brpm_home
        @timenow = eval( Time.now.utc.iso8601 )
    end
    def debug( msg )
        @log.debug ( '[DEBUG] ' + @timenow + " #{msg}" )
    end
    def info( msg )
        @log.info ( '[INFO] ' + @timenow + " #{msg}" )
    end
    def warn( msg )
        @log.warn ( '[WARNING] ' + @timenow + " #{msg}" )
    end
    def error( msg )
        @log.error ( '[ERROR] ' + @timenow + " #{msg}" )
    end
    def fatal( msg )
        @log.fatal ( '[FATAL] ' + @timenow + " #{msg}" )
    end
end

そして、ここにテストがあります:

require 'minitest/autorun'
require_relative "./../../../lib/rpm/core/logger"

class TestLogger < MiniTest::Unit::TestCase
  def setup
    @logger = RPMLogger.new
    @test_msg = "This is a test log message!"
  end

  def test_debug_messages
    log = @logger.debug( @test_msg )
    assert_match "/^[DEBUG] /", log, msg=nil
  end

end

おそらく両方のファイルにいくつかのエラーがあることを最初に認めますが (私はまだ学習中です)、一度に 1 つずつステップを踏んでみます。

これを行うにはおそらくいくつかの方法がありますが、これがその1つであるかどうかはわかりません。

を使用@log = ::Logger.newすることは表面上は妥当に思えますがinclude log4r、代わりにモジュールを拡張するために を実行する必要がありますか? ( Rubyごと: モジュール、require および include )

関連するSOの記事を検索し、「初期化」する引数に関してWebで検索しました。それらは直接関係がないか、私が誤解しています。任意の支援をいただければ幸いです。

4

1 に答える 1

2

マニュアルのコードサンプルから:

require 'log4r'
include Log4r

# create a logger named 'mylog' that logs to stdout
mylog = Logger.new 'mylog'
mylog.outputters = Outputter.stdout

を使用できるようにするために、不足しているように見えるのは、 an句のLogger下に追加することです。requireinclude

require 'log4r'
include Log4r

Log4r::Loggerまたは、明示的に呼び出すこともできます。

class Loggerで宣言されているため、これが必要です: module Log4r

module Log4r

  # See log4r/logger.rb
  class Logger
  ...

を呼び出すinclude Log4rと、宣言されているすべての定数がLog4rコードで使用可能になり、Loggerそのうちの 1 つになります。

于 2014-05-06T17:24:59.730 に答える