NameError: неинициализированная константа Logger. Должен ли я делать это по-другому?

Довольно новичок в 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

Я буду первым, кто признает, что в обоих файлах, вероятно, есть несколько ошибок (поскольку я все еще учусь), но я постараюсь сделать это шаг за шагом.

Вероятно, есть несколько способов сделать это, я просто не уверен, что это один из них.

На первый взгляд использование @log = ::Logger.new кажется разумным, но, возможно, вместо этого мне следует использовать include log4r для расширения модуля? (согласно Ruby: модуль, требование и включение)

Я искал связанные статьи SO и в Интернете относительно аргументов для «инициализации». Либо они не связаны напрямую, либо я их неправильно понимаю. Любая помощь приветствуется.


person jbobbylopez    schedule 06.05.2014    source источник


Ответы (1)


Из примера кода в руководстве:

require 'log4r'
include Log4r

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

Что вам, кажется, не хватает, чтобы иметь возможность использовать Logger, так это добавить ниже вашего require предложение include:

require 'log4r'
include Log4r

В качестве альтернативы вы можете вызвать Log4r::Logger явно.

Это необходимо, так как class Logger объявлен в module Log4r:

module Log4r

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

Вызов include Log4r делает все константы, объявленные в Log4r, доступными в вашем коде, Logger является одной из них.

person Uri Agassi    schedule 06.05.2014
comment
Спасибо Ури, это то, что я искал! - person jbobbylopez; 06.05.2014