Techioz Blog

RSpec テストで例外を発生させる方法

概要

テストシナリオで行き詰まっています。

コントローラーメソッドがあります:

def update
  @object = Object.find params[:id]
  # some other stuff
  @object.save
  rescue ActiveRecord::StaleObjectError
    # woo other stuff
end  

最初の部分は次のようにテストします。

context '#update'
  let(:object) { double }

  it 'nothing fails' do
    # some other stuff
    expect(Object).to receive(:find).with('5').and_return(object)
    expect(object).to receive(:save).and_return(true)
    xhr :put, :update, id:5
    expect(response).to be_success
    expect(assigns(:object)).to eq(object)
  end
end

次に、ActiveRecord::StaleObjectError 例外をテストしたいと思います。スタブ化したいのですが、これを行う方法が見つかりませんでした。

そこで私の質問は、RSpec テストで ActiveRecord::StaleObjectError を発生させるにはどうすればよいですか?

解決策

たとえばこのように

expect(object).to receive(:save).and_raise(ActiveRecord::StaleObjectError)