2011-02-04 10 views
10

私はRails 2からRails 3のアプリケーション(私が書いたコードではない)をアップグレードしています。 (よくテストされたコード)はshouldaとTest :: Unitを使用し、マクロshould_createとshould_changeを広範囲に使用します。Rails 3の非推奨警告を選択的にミュートするにはどうすればよいですか?

this discussionから、shouldaのメンテナーは両方のメソッドを取り除きたいが、Test :: Unitを使っている人はそれが必要でないと分かっていることを理解している。

Anaway、指定されたマクロの非推奨警告を選択的に有効にする方法はありますか?テスト環境ファイルで

ActiveSupport::Deprecation.silenced = true 

と私はまた、あなたがブロック内のコードの特定の部分を置くことができることを知っている:私はすでにあなたが完全に設定することにより、レーキテスト出力で非推奨の警告をオフにすることができるthis postingから知っています彼らは沈黙を取得する:

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

後者はオプションですが、すべてのテストの上に行くと、そのようなブロックでshould_createマクロを囲むために私を必要とします。だから私は、特定のマクロの警告を完全に1つの構成設定で排除する方法があるのだろうと思っていましたか?

答えて

3

は、実際に私はSTIL、私がインストールされていたプラグインや宝石にあったコードから他の非推奨の警告をたくさん持っていたがあります。そのほとんどを避けるために、私は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を交換する必要があります。その名前を取得するための一般的な方法はおそらくありますが、今すぐ見つけることができませんでした。

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 
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ためです。

+2

まだActiveSupport 4で動作します。 –

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 
関連する問題