2016-11-23 18 views
5

Tôi có một kịch bản kết thúc tốt đẹp xung quanh các thử nghiệm trong RSpec 3.4.4 và khiến chúng hết thời gian chờ sau mười giây.Tôi làm cách nào để đặt siêu dữ liệu RSpec toàn cầu?

TIMEOUT = 10 

RSpec.configure do | config | 
    config.around do |example| 
    timeout = Float(example.metadata[:timeout]) rescue TIMEOUT 
    begin 
     Timeout.timeout(timeout) { example.run } 
    rescue Timeout::Error 
     skip "Timed out after #{timeout} seconds" 
    end 
    end 
end 

Kịch bản này là ở một vị trí trung tâm - ~/lib/spec_helper.rb - và là require d bởi spec_helper s trong kho của tôi.

Tôi muốn để có thể cấu hình example.metadata[:timeout] tại một mức kho rộng, để có tất cả thời gian thông số kỹ thuật của nó ra (ví dụ) sau hai giây, hoặc (ví dụ khác) không phải ở tất cả.

Tôi đã thử đặt tùy chọn này làm tùy chọn trong .rspec - một giải pháp lý tưởng cho tôi - nhưng tất nhiên nó không nhận ra các tùy chọn tùy chỉnh như vậy. Tôi sẽ mong đợi dòng lệnh để làm chính xác điều tương tự.

Có cách nào để đặt siêu dữ liệu cho tất cả các ví dụ trong bộ thử nghiệm không?

Trả lời

1

Ngoài hack vào internals RSpec, mà có lẽ không phải là một ý tưởng tốt, cách duy nhất bạn có thể làm điều này là bằng cách lợi dụng một tùy chọn có sẵn:

Tùy chọn thẻ là một ứng cử viên tốt cho việc này vì nó cho phép bạn nhập các cặp khóa/giá trị. Ưu điểm của điều này là nó có thể được đặt trong tệp .rspec và có thể được ghi đè bởi đối số dòng lệnh. Ví dụ,

.rspec cấu hình

--format documentation 
--color 
--tag timeout:10 
--require spec_helper 

dòng lệnh

rspec --tag timeout:2 

Bạn chỉ cần phải cẩn thận và chắc chắn rằng bạn loại bỏ các thẻ từ bộ lọc hoặc tất cả các bài kiểm tra sẽ được lọc ra ... Để sử dụng, trong trường hợp của bạn, bạn chỉ cần làm:

RSpec.configure do | config | 
    timeout = config.filter.delete(:timeout) || 10 

    config.around do |example| 
    begin 
     Timeout.timeout(timeout) { example.run } 
    rescue Timeout::Error 
     skip "Timed out after #{timeout} seconds" 
    end 
    end 
end 

Trong thời gian chờ thiết lập ví dụ cụ thể này về 0 sẽ vô hiệu hóa việc sử dụng hết thời gian chờ.

Thứ tự ưu tiên từ cao nhất đến thấp nhất là command line arg>.rspec configuration>default specified in your config block.

+0

Trên thực tế, như bạn [ban đầu] đã viết nó, thiết lập thời gian chờ bằng không sẽ dừng ví dụ từ chạy ở tất cả. May thay, tất cả những gì bạn cần làm là loại bỏ mệnh đề 'trừ', vì' Timeout.timeout (0) {...} 'sẽ không hết thời gian chờ. – PJSCopeland

+0

ah tôi đã không thực sự chắc chắn về điều đó ... Tôi sẽ thay đổi câu trả lời – David

1

Tùy chọn define_derived_metadata thực hiện chính xác những gì bạn muốn: "Trong ví dụ cụ này thiết lập thời gian chờ bằng không sẽ vô hiệu hóa việc sử dụng các timeout"

define_derived_metadata(*filters) {|metadata| ... } ⇒ void 

RSpec.configure do |config| 
# Tag all groups and examples in the spec/unit directory with 
# :type => :unit 
config.define_derived_metadata(:file_path => %r{/spec/unit/}) do |metadata| 
    metadata[:type] = :unit 
end 
end 

Kiểm tra nó trên rubydoc.info

+0

Tuyệt vời! Điều duy nhất còn thiếu là một cách dễ dàng để bật hoặc tắt nó. – PJSCopeland

+0

Bạn có thể mở rộng giải pháp này và chứng minh cách cấu hình này cho tùy chọn tùy chỉnh từ tệp rspec và dòng lệnh không? Tôi đang đấu tranh để tìm ra từ tài liệu. – David

Các vấn đề liên quan