成功時 / 失敗時なんかで振る舞いを分けるけど、その前に共通の処理を書いてる、って場面は結構あります。
たとえば
def create @article = Article.new(params[:article]) if @article.save ... else ... end end
みたいなやつです。if の前に、共通の処理がある。
こういうときに、丁寧だけど愚直に spec を書くと
describe 'POST /articles' do before { ... } describe 'で、適切な値が渡されたとき' do before { ... } it 'は、新しい記事を作成すること' do ... end ... end describe 'で、不適切な値が渡されたとき' do before { ... } it 'は、新しい記事を作成すること' do ... end ... end end
のように、@article = Article.new(params[:article]) に対する example を 2 回書く必要があります。
こういうときは、成功時のパターンだけに書くっていうのもありですが it_should_behave_like を使うときれいに書けます。
describe 'POST /articles' do before { ... } describe 'all conditions', :shared => true do it 'は、新しい記事を作成すること' do ... end end describe 'で、適切な値が渡されたとき' do before { ... } it_should_behave_like 'all editions' ... end describe 'で、不適切な値が渡されたとき' do before { ... } it_should_behave_like 'all editions' ... end end
共通な振る舞いに :shared => true オプションをつけて、実際の振る舞いで it_should_behave_like(:shared => true にした振る舞いの説明文字列) と書けば、その振る舞いが実行されます。