NameError: undefined локальная переменная или метод `logger '

Когда я запускаю 'script/server', все работает нормально, но когда я запускаю свои модульные тесты (rake test:units), я получаю ошибку ниже и не знаю, как это решить.

Error

NameError: undefined local variable or method `logger' for #<GiveawayEligibleMemberTest:0x10477dff8>
    /Users/kamilski81/Sites/pe/vitality_mall/vendor/rails/actionpack/lib/action_controller/test_process.rb:471:in `method_missing'
    /Users/kamilski81/Sites/pe/vitality_mall/lib/update_giveaway_eligible_members.rb:17:in `is_valid_checksum?'
    /Users/kamilski81/Sites/pe/vitality_mall/test/unit/giveaway_eligible_member_test.rb:26:in `test_that_checksum_is_valid'
    /Users/kamilski81/Sites/pe/vitality_mall/vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:60:in `__send__'
    /Users/kamilski81/Sites/pe/vitality_mall/vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:60:in `run'

Я попытался поставить:

class Test::Unit::TestCase
  RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)
  RAILS_DEFAULT_LOGGER.level = Logger::WARN

  logger = Logger.new(STDOUT)
  logger.level = Logger::WARN
end

Вот код, который использует мой регистратор:

def is_valid_checksum?(csv_arr)
  expected_row_count = csv_arr[0][3].to_i
  logger.debug "Expected record count: #{expected_row_count}"
  actual_row_count = csv_arr.nitems - 1
  logger.debug "Actual record count: #{actual_row_count}"
  checksum_valid = false
  if expected_row_count == actual_row_count
    logger.debug "Checksum is valid"
    checksum_valid = true
  end

  return checksum_valid
end

Но это еще не решило ошибку

Ответы

Ответ 1

Вы можете использовать регистратор Rails вне моделей и контроллеров:

Rails.logger.info "..."

Источник

Ответ 2

Метод logger недоступен для проверки методов экземпляров примеров.

В определении класса вы указали локальную переменную, но этого недостаточно. Переменная logger выпадает из области действия после инициализации класса. Возможно, вы ищете переменную класса (@@logger). Но более чистое решение будет обертывать его таким способом.

class Test::Unit::TestCase
  def logger
    RAILS_DEFAULT_LOGGER ||= Logger.new(STDOUT)
  end
end

Обратите внимание, что этот код будет использовать регистратор по умолчанию, если он доступен (каким он должен быть). Если это нежелательно, вы можете сделать свой собственный так же легко.

def logger
  @logger ||= Logger.new(STDOUT)
end

Ответ 3

вы должны использовать RAILS_DEFAULT_LOGGER.debug константу в вашем тестовом примере is_valid_checksum? а не переменной logger (переменная уровня класса), которая не может использоваться в методе экземпляра.

Я бы предложил обернуть код в методе экземпляра что-то вроде

def logger
  logger = Logger.new(STDOUT)
  logger.level = Logger::WARN
  logger
end

а затем используйте logger