「おい!ちゃんとロールバックしてるか!!」を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派ではありませんので、ご安心あれ。