如何有选择地静音Rails 3弃用警告?

时间:2011-02-04 17:59:16

标签: ruby-on-rails unit-testing configuration deprecated shoulda

我正在将Rails 2升级到Rails 3应用程序(代码不是由我编写的)。 (经过良好测试的代码)使用shoulda和Test :: Unit,并广泛使用宏should_create和should_change。

我从this discussion了解到,维护人员希望摆脱这两种方法,但使用Test :: Unit的人并不觉得有必要(不确定我是否正在抓住整个讨论)。

Anaway,有没有办法有选择地关闭指定宏的弃用警告?我已经从this posting知道您可以通过设置完全关闭Rake测试输出中的弃用警告:

ActiveSupport::Deprecation.silenced = true

在您的测试环境文件中,我也知道您可以将特定的代码块放在一个块中以使它们静音:

ActiveSupport::Deprecation.silence do
# no warnings for any use of deprecated methods here
end

后者是一个选项,但需要我检查所有测试并将should_create宏包含在这样的块中。所以我想知道有一种方法可以通过一个配置设置完全消除特定宏的警告吗?

4 个答案:

答案 0 :(得分:6)

旧问题 - 但如果您有新的折旧,您可以有选择地忽略:

ActiveSupport::Deprecation.behavior = lambda do |msg, stack| 
  unless /LIBRARY_NAME/ =~ msg
    ActiveSupport::Deprecation::DEFAULT_BEHAVIORS[:stderr].call(msg,stack) # whichever handlers you want - this is the default
  end
end

这是ActiveSupport 3

答案 1 :(得分:3)

事实上,我已经从我安装的插件或宝石中的代码中获得了许多其他弃用警告。为了避免大部分问题,我在test_helper.rb中覆盖了Deprecation :: warn方法。因此,请使用:

而不是之前的代码
module ActiveSupport
  module Deprecation
    class << self
      def warn(message = nil, callstack = caller)
        # modif pvh the following lines make sure no deprecation warnings are sent 
        # for code that is
        # not by my but in some gem or plugin...
        return if silenced  || callstack.grep(/myrailsappname/).blank?
        # return if silenced 
        deprecation_message(callstack, message).tap do |m|
          behavior.each { |b| b.call(m, callstack) }
        end
      end
    end
  end
end  

顺便说一下,你需要用你的应用程序名称(它所在的文件夹的名称)替换myrailsappname。获得该名称可能有更通用的方法,但我现在找不到它。

答案 2 :(得分:2)

我可以推荐替代方案吗?

module ActiveSupport
  class Deprecation
    module Reporting
      # Mute specific deprecation messages
      def warn(message = nil, callstack = nil)
        return if message.match(/Automatic updating of counter caches/)

        super
      end
    end
  end
end

答案 3 :(得分:0)

我想我找到了一个解决方案:在test / test_helper.rb中我重新打开了模块并用相同的定义覆盖了宏定义,但弃用警告被注释掉了。可能有更优雅的方法来做到这一点......

# modif pvh DEPREC
# reopen the module and silence the deprecation statement to avoid 
# having my results overflown by these deprecation warnings...
module Shoulda # :nodoc:
  module Macros
    def should_create(class_name)
      ##::ActiveSupport::Deprecation.warn
      should_change_record_count_of(class_name, 1, 'create')
    end
  end
end