2016-11-23 40 views
5

私は、RSpec 3.4.4のテストを包み込み、10秒後にタイムアウトするスクリプトを持っています。 ~/lib/spec_helper.rb - -グローバルRSpecメタデータはどのように設定できますか?

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 

このスクリプトは、中央の場所にあり、私のリポジトリにspec_helper sだけrequire dとします。

私は全く(例えば)そのスペックタイムアウトのすべて 2秒後、または(別の例)を持つように、リポジトリ全体レベルでexample.metadata[:timeout]を設定できるようにしたいと思います。

私は、.rspecのオプションとして設定しようとしました。それは理想的な解決策ですが、そのようなカスタムオプションは認識されません。私は、コマンドラインがまったく同じことをすると期待します。

テストスイート内のすべてのサンプルに対してメタデータを設定する方法はありますか?

答えて

1

別に、おそらく良いアイデアではありませんRSpecのの内部、でハッキングから、あなたがこれを行うことができる唯一の方法が利用できるオプションを乱用することです:それは許す限り

タグオプションは、このための良い候補でありますキーと値のペアを入力します。これの利点は、.rspecファイルで設定でき、コマンドライン引数で上書きできる点です。例えば、

.rspec設定

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

コマンドライン

rspec --tag timeout:2 

あなただけ気をつけて、あなたは、フィルタまたはすべてのテストからタグを削除することを確認する必要があります除外されます...これを使用するには、あなたの場合は、単に行うでしょう:

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 

タイムアウトをゼロに設定するこの特定の例では、タイムアウトの使用を無効にします。

優先順位の高い順は、command line arg>.rspec configuration>default specified in your config blockです。

+0

でそれを確認してください実際には、[元々]書き込んだように、タイムアウトをゼロに設定すると、サンプルがまったく実行されなくなります。幸いにも、 'Timeout.timeout(0){...}'はタイムアウトしないので、 'unless'節を削除するだけです。 – PJSCopeland

+0

ああ、私は実際にそれについては確かではなかった...私は答えを変更するだろう – David

1

define_derived_metadataオプションは、正確に何をしたいん:

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

素晴らしい!行方不明の唯一のものは、それをオンまたはオフにする簡単な方法です。 – PJSCopeland

+0

このソリューションを拡張して、これがrspecファイルとコマンドラインのカスタムオプション用にどのように構成されているかを実証できますか?私はドキュメントからそれを理解するのに苦労しています。 – David

関連する問題