2015-09-18 22 views
8

before(:each)ブロックをのすべてのスペックで実行しようとしています。type: :featureを除きます。Rspec.config before(:each):特定のタイプを除く

私はそれが働いて得ることができる唯一の方法は、カットアンドペーストをし、種類ごとに個別の設定ブロックを持つことです。 (:type => :model:type => :serviceなど)

スペック/ rails_helper.rb

# To speed up tests, stub all Paperclip saving and reading to/from S3 
config.before(:each, :type => :model) do 
    allow_any_instance_of(Paperclip::Attachment).to receive(:save).and_return(true) 
end 

はよりDRYアプローチはありますか?

+0

あなたは 'config.beforeを試してみました(:それぞれを、:{!| V | V =:機能}タイプ=>ラムダ)' – Yule

+1

@ユール作品!私はこのアプローチが本当に好きです。回答を投稿すると私はそれを受け入れるよ – madcow

+0

素晴らしい!私が読んだいくつかの他のドキュメントからちょうど愚かです。回答が追加されました。お役に立てて嬉しいです。 – Yule

答えて

10

あなたの前のブロックに渡すものは「conditions hash」です。 RSpecは、それらの条件に合致する例や文脈に対してのみ前に適用する。

ハッシュはかなりフレキシブルで、完了したように直接type: :modelのような単純なことができますが、任意の名前の任意のタイプのメタデータをクエリできます。一例として、

:foo => 'bar' 
    :foo => /^ba/ 
    :foo => lambda {|v| v == 'bar'} 
    :foo => lambda {|v,m| m[:foo] == 'bar'} 

:foofilter run excludingからは、例えば何でも、タイプである可能性があります。しかし、ラムダ構文では、仕様を実行したい状況で非常に具体的にできるように、柔軟性があります。

あなたはこのような何か行うことができますあなたの場合は

config.before(:each, :type => lambda {|v| v != :feature}) do 
    allow_any_instance_of(Paperclip::Attachment).to receive(:save).and_return(true) 
end 
2

あなたはaroundフックを経由しての例のメタデータを判断するためにunlessを使用することができます。

RSpec.configure do |config| 
    config.around(:each) do |example| 
    example.run unless example.metadata[:type].eql? :feature 
    end 
end 
関連する問題