首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NameError:未定义的局部变量或方法“`logger”

NameError:未定义的局部变量或方法“`logger”
EN

Stack Overflow用户
提问于 2011-07-22 00:13:07
回答 3查看 19.4K关注 0票数 35

当我运行‘脚本/服务器’时,一切正常,但是当我运行我的单元测试(rake test:units)时,我得到以下错误,并且不确定如何解决这个问题。

错误

代码语言:javascript
复制
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'

我试着把:

代码语言:javascript
复制
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

下面是使用我的记录器的代码:

代码语言:javascript
复制
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

但是这仍然不能解决错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-28 00:15:55

您可以在模型和控制器之外使用Rails记录器:

代码语言:javascript
复制
Rails.logger.info "..."

Source

票数 73
EN

Stack Overflow用户

发布于 2011-07-22 01:49:58

logger方法不可用于测试用例实例方法。

您已经在类定义中定义了一个局部变量,但这还不够。一旦类被初始化,记录器变量就会超出作用域。您可能正在寻找一个类变量(@@logger)。但更干净的解决方案应该是将其包装在这样的方法中。

代码语言:javascript
复制
class Test::Unit::TestCase
  def logger
    RAILS_DEFAULT_LOGGER ||= Logger.new(STDOUT)
  end
end

请注意,此代码将使用默认记录器(如果它可用)(它应该是可用的)。如果这不是您想要的,您也可以很容易地制作自己的。

代码语言:javascript
复制
def logger
  @logger ||= Logger.new(STDOUT)
end
票数 6
EN

Stack Overflow用户

发布于 2011-07-22 01:32:33

您应该在测试用例is_valid_checksum中使用RAILS_DEFAULT_LOGGER.debug常量吗?而不是不能在实例方法中使用的变量记录器(类级别变量)。

我建议将代码包装在实例方法中,如下所示

代码语言:javascript
复制
def logger
  logger = Logger.new(STDOUT)
  logger.level = Logger::WARN
  logger
end

然后使用logger

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6779250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档