Rails4 rspecのテストでスタブで例外を投げる

テストでスタブでsave!で例外を投げるようにしたかった。


Recordクラスの下記のようなsave_recordという関数があったとする。

def save_record(user)
  begin
    self.transaction do    
      record= self.new
      record.user_id = user.id
      record.user_name = user.name

      record.save!
    end
    return true
  rescue
    return false
  end
end

この場合、保存が失敗したときにfalseがちゃんと帰ってくるかテストするためには、save!が例外を投げるしかない。
そこで、スタブを使って例外を投げることにした。
beforeで@user1にデータが設定されているものとする。

it "保存に失敗した場合、falseを返す" do       
  # save!で例外を投げるように細工
  Record.any_instance.stub(:save!).and_raise(ActiveRecord::RecordInvalid)
        
  expect(Record.save_record(@user1)).to be_false
end

Recordクラスのsave_record内で呼ばれるsave!が例外を投げるので、保存に失敗し、falseが返ってきた。


参考:
ruby - How to stub error raising using Rspec in Rails? - Stack Overflow
Rails4 rspecによるスタブ、モックを使ったテスト - ayaketanのプログラミング勉強日記