NameError:未定义的局部变量或方法“记录器”
Posted
技术标签:
【中文标题】NameError:未定义的局部变量或方法“记录器”【英文标题】:NameError: undefined local variable or method `logger' 【发布时间】:2011-10-10 09:23:03 【问题描述】:当我运行“脚本/服务器”时,一切正常,但当我运行单元测试 (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
但这仍然不能解决错误
【问题讨论】:
【参考方案1】:您可以在模型和控制器之外使用 Rails 记录器:
Rails.logger.info "..."
Source
【讨论】:
我使用 gem 将我的 rake 任务安排为 cron 任务,这个答案帮助我将日志记录到log/cron.log
【参考方案2】:
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。调试测试用例中的常量 is_valid_checksum?不是不能在实例方法中使用的变量记录器(类级别变量)。
我建议将代码包装在类似的实例方法中
def logger
logger = Logger.new(STDOUT)
logger.level = Logger::WARN
logger
end
然后使用记录器
【讨论】:
您的语法高亮显示已关闭。您可能应该使用实例变量来保存记录器。像@logger ||= Logger.new
这样的记录器不会在每次调用时都重新初始化。以上是关于NameError:未定义的局部变量或方法“记录器”的主要内容,如果未能解决你的问题,请参考以下文章
Action Mailer NameError:未定义的局部变量或方法“smtp”
FastlaneCore::Helper::AppcenterHelper:Class (NameError) 的未定义局部变量或方法“所有者”
nameerror 未定义的局部变量或方法 `log_out' 你的意思是? logout_url ruby on rails
ruby NameError:未定义的局部变量或StartupMailer的方法`respond_to_new_founder':Class; def之前的空格问题(如char)