NameError:未定义的局部变量或方法`logger'

Kam*_*i81 25 ruby logging ruby-on-rails

当我运行'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'
Run Code Online (Sandbox Code Playgroud)

我尝试过:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

但这仍然无法解决错误

mbi*_*ard 53

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

Rails.logger.info "..."
Run Code Online (Sandbox Code Playgroud)

资源


die*_*mes 6

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

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

class Test::Unit::TestCase
  def logger
    RAILS_DEFAULT_LOGGER ||= Logger.new(STDOUT)
  end
end
Run Code Online (Sandbox Code Playgroud)

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

def logger
  @logger ||= Logger.new(STDOUT)
end
Run Code Online (Sandbox Code Playgroud)