読者です 読者をやめる 読者になる 読者になる

ウェブサービスを作っています。

it_should_behave_like が割と便利

rspec

成功時 / 失敗時なんかで振る舞いを分けるけど、その前に共通の処理を書いてる、って場面は結構あります。
たとえば

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 にした振る舞いの説明文字列) と書けば、その振る舞いが実行されます。