2012-12-19 9 views
5

Tôi đang sử dụng các thủ thuật sau đây (từ http://mikbe.tk/2011/02/10/blazingly-fast-tests/) để đảm bảo mô hình được tải lại trên mỗi RSpec chạy với Spork:hằng redefined với Spork

Spork.each_run do 
    load "#{Rails.root}/config/routes.rb" 
    Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 
    # ..... 
end 

Tuy nhiên nó gây ra những cảnh báo sau mỗi khi tôi chạy thử nghiệm của tôi:

/myproject/app/models/model.rb:36: warning: already initialized constant CONFIGURABLE

nào tôi có thể tránh bằng cách đặt:

if !defined?(A_CONSTANT)

sau mỗi lần liên tục, không thực sự trông đúng (nhưng nó hoạt động). Bất kỳ đề xuất nào về cách tôi có thể thực hiện công việc này đúng cách? (tức là mô hình của tôi vẫn sẽ tải lại trong các thử nghiệm, nhưng tôi không phải đặt if sau mỗi định nghĩa không đổi.)

+0

Không chắc chắn chính xác về vấn đề của bạn với các cảnh báo, nhưng tôi đã được tìm kiếm vào thử nghiệm hiệu suất các bộ kiểm tra RSpec, vì vậy bạn có thể tìm thấy [câu trả lời StackOverflow] (http://stackoverflow.com/a/12215946/567863) tham chiếu cho tệp ** spec_helper.rb ** của bạn. –

+1

Tôi đã thấy điều này xảy ra khi bạn khai báo một hằng số có cùng tên, nhưng bên trong của một đặc tả thay vì mã sản xuất của bạn. –

Trả lời

0

sử dụng "tải" sẽ khiến tệp được tải lại và điều đó có nghĩa là tệp đó có các hằng số được xác định, các hằng số đó sẽ được định nghĩa lại mỗi khi nó được nạp. Sử dụng "require" thay vì tải thường được ưa thích vì nó tránh được vấn đề này bằng cách không tải lại tệp nếu nó đã được tải.

Tuy nhiên, rõ ràng bạn không muốn tải lại tập tin của bạn trong thế giới thử nghiệm, vì vậy bạn có thể ngăn chặn cảnh báo trong khi làm tải rằng:

Spork.each_run do 
    Kernel.silence_warnings do 
    load "#{Rails.root}/config/routes.rb" 
    Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 
    # ..... 
    end 
end