「おい!ちゃんとロールバックしてるか!!」をRSpecで表現する

Railsアプリケーションのコントローラでは、なにかしらの例外が発生するとデータベースの変更をロールバックしますよね。

class ItemsController < ApplicationController
  def create
    Item.transaction do
      ...
      if エラー条件
        raise ActiveRecord::Rollback
      end
    end
  end
end

これをRSpecで表現したものが以下です。動作確認はしていません。なんとなくイメージしてください。あと、ポイントは#and_call_original (https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/calling-the-original-method!) です。

describe ItemsController, "商品管理" do
  describe "新しい商品を登録する", "POST create" do
    context "エラーが発生した場合" do
      it "データベースの変更をロールバックする" do
        ... stubなどを使ってエラー条件を成立させる ...
        ActiveRecord::Base.connection.should_receive(:rollback_db_transaction).once.and_call_original
        post(:create, id: 1)
      end
    end
  end
end

以下の記事を参考にしています。有益な記事を提供してくださり、ありがとうございます。

環境は以下です。

最近、test-unit派からRSpec派に移行しました。Cucumber派になるのはもうすぐか!?あと、MiniTest派ではありませんので、ご安心あれ。