Ответ 1
Вы можете использовать регистратор Rails вне моделей и контроллеров:
Rails.logger.info "..."
Когда я запускаю 'script/server', все работает нормально, но когда я запускаю свои модульные тесты (rake test:units
), я получаю ошибку ниже и не знаю, как это решить.
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
Но это еще не решило ошибку
Вы можете использовать регистратор Rails вне моделей и контроллеров:
Rails.logger.info "..."
Метод logger
недоступен для проверки методов экземпляров примеров.
В определении класса вы указали локальную переменную, но этого недостаточно. Переменная logger выпадает из области действия после инициализации класса. Возможно, вы ищете переменную класса (@@logger
). Но более чистое решение будет обертывать его таким способом.
class Test::Unit::TestCase
def logger
RAILS_DEFAULT_LOGGER ||= Logger.new(STDOUT)
end
end
Обратите внимание, что этот код будет использовать регистратор по умолчанию, если он доступен (каким он должен быть). Если это нежелательно, вы можете сделать свой собственный так же легко.
def logger
@logger ||= Logger.new(STDOUT)
end
вы должны использовать RAILS_DEFAULT_LOGGER.debug константу в вашем тестовом примере is_valid_checksum? а не переменной logger (переменная уровня класса), которая не может использоваться в методе экземпляра.
Я бы предложил обернуть код в методе экземпляра что-то вроде
def logger
logger = Logger.new(STDOUT)
logger.level = Logger::WARN
logger
end
а затем используйте logger