2016-11-23 12 views
5

RSpec 3.4.4'te sınamaları saran ve on saniye sonra zaman aşımına neden olan bir komut dosyası var.Genel RSpec meta verilerini nasıl ayarlayabilirim?

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 

Bu komut dosyası, merkezi bir konumda - ~/lib/spec_helper.rb - ve benim depoları spec_helper s tarafından require ö.

ben, ya da (başka örneğin) hiç iki saniye sonra (örneğin) onun gözlük zaman aşımına tüm olması, bir arşiv genelinde seviyesinde example.metadata[:timeout] yapılandırabilecektir istiyorum

.

.rspec - benim için ideal bir çözüm olarak bir seçenek olarak ayarlamayı denedim - ama tabii ki bunun gibi özel seçenekleri tanımıyor. Komut hattının da aynı şeyi yapmasını beklerdim.

Test paketindeki tüm örneklerin meta verilerini ayarlamanın bir yolu var mı? o izin verdiği

etiket seçeneği bunun için iyi bir adaydır: Apart iyi bir fikir, bunu tek yolu muhtemelen mevcut seçeneklerden kötüye kullanarak değil ki, RSpec aralıklarında hack gelen

cevap

1

anahtar/değer çiftlerini girersiniz. Bunun avantajı .rspec dosyasında ayarlanabilir ve komut satırı argümanı ile geçersiz kılınabilir. Örneğin,

.rspec yapılandırma

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

komut satırı

rspec --tag timeout:2 

için sadece dikkatli olun ve size filtre veya tüm testlerden etiketi kaldırmak emin olmak zorunda filtrelenecek ... Bunu kullanmak için, sizin durumunuza basitçe yaparsınız:

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 

Bu özel örnekte, zaman aşımı sıfır olarak zaman aşımlarının kullanılmasını devre dışı bırakır.

Öncelik sırası en yüksekten en düşüğe doğru command line arg>.rspec configuration>default specified in your config block.

+0

üzerine edin Aslında, siz [aslen] yazdıkça, zaman aşımını sıfır olarak ayarlamak, örneğin çalışmayı durduracaktır. Neyse ki, yapmanız gereken tek şey 'tim'.sonraki.timeout (0) {...}' zaman aşımına uğramaz. – PJSCopeland

+0

ah aslında bundan emin değildim ... Cevabını değiştireceğim – David

1

define_derived_metadata seçenek tam olarak ne istediğinizi yapar: "aşımları kullanımını devre dışı bırakır sıfıra zaman aşımı ayarını Bu özel örnekte"

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 

rubydoc.info

+0

Harika! Eksik olan tek şey onu açmak veya kapatmak için kolay bir yoldur. – PJSCopeland

+0

Bu çözümü genişletip, bunun rspec dosyası ve komut satırından özel bir seçenek için nasıl yapılandırıldığını gösterebilir misiniz? Dokümantasyondan anlamaya çalışıyorum. – David

İlgili konular