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)

NameError:未定义全局名称“记录器”

未初始化的常量 Logger (NameError)