2011-02-04 63 views
10

Tôi đang nâng cấp ứng dụng Rails 2 lên Rails 3 (mã không được viết bởi tôi). Mã (cũng được kiểm tra) sử dụng lệnh shoulda và Test :: Unit và sử dụng rộng rãi các macro should_create và should_change.Tôi làm cách nào để tắt tiếng cảnh báo ngừng sử dụng Rails 3 một cách chọn lọc?

Tôi hiểu từ this discussion rằng những người duy trì điều ước muốn loại bỏ cả hai phương pháp nhưng những người sử dụng Test :: Unit không thấy cần thiết (không chắc chắn tôi đang nắm bắt toàn bộ cuộc thảo luận).

Anaway, có cách nào để chọn lọc cảnh báo không dùng nữa cho các macro được chỉ định không? Tôi đã biết từ this posting rằng bạn có thể tắt các cảnh báo không dùng nữa trong kết quả thử nghiệm Rake hoàn toàn bằng cách thiết lập:

ActiveSupport::Deprecation.silenced = true 

trong file môi trường thử nghiệm của bạn và tôi cũng biết rằng bạn có thể đặt phần cụ thể của mã trong một khối để khiến họ im lặng:

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

Tùy chọn thứ hai là yêu cầu nhưng phải yêu cầu tôi thực hiện tất cả các thử nghiệm và kèm theo macro cần thiết trong khối như vậy. Vì vậy, tôi đã tự hỏi có một cách để loại bỏ cảnh báo cho các macro cụ thể hoàn toàn với một thiết lập cấu hình?

Trả lời

3

Thực tế, tôi đã có rất nhiều cảnh báo không dùng nữa từ mã được bổ sung hoặc đá quý mà tôi đã cài đặt. Để tránh hầu hết điều đó, tôi ghi đè phương thức Deprecation :: warn trong test_helper.rb. Vì vậy, thay vì mã trước đó, hãy sử dụng:

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 

BTW bạn cần thay myrailsappname bằng tên ứng dụng của bạn (tên của thư mục nằm trong đó). Có lẽ một cách chung chung hơn để có được tên đó, nhưng tôi không thể tìm thấy nó ngay bây giờ.

0

Tôi nghĩ rằng tôi đã tìm thấy một giải pháp: trong test/test_helper.rb Tôi mở lại mô-đun và ghi đè định nghĩa macro với định nghĩa giống hệt nhưng cảnh báo không dùng nữa đã nhận xét. Có thể có nhiều cách thanh lịch hơn để thực hiện điều này mặc dù ...

# 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

Cũ câu hỏi - nhưng nếu bạn có khấu hao mới mà bạn muốn để có lựa chọn bỏ qua:

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 

này là dành cho ActiveSupport 3.

+2

Vẫn hoạt động trong ActiveSupport 4. –

2

Tôi có thể đề xuất giải pháp thay thế không?

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 
Các vấn đề liên quan