NameError: неопределенная локальная переменная или метод `logger ' - PullRequest
23 голосов
/ 21 июля 2011

Когда я запускаю «скрипт / сервер», все работает нормально, но когда я запускаю свои модульные тесты (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

Но это все равно не решает ошибку

Ответы [ 3 ]

51 голосов
/ 27 октября 2011

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

Rails.logger.info "..."

Источник

4 голосов
/ 21 июля 2011

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

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

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

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

def logger
  @logger ||= Logger.new(STDOUT)
end
0 голосов
/ 21 июля 2011

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

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

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

, а затем использовать регистратор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...