RSpec で transaction のテスト
投稿者 okkez
Yuya さんのヒントをもとにしてこんな風にしてみました。
sqlite3? は spec_helper に定義した。ヘルパーメソッド。 SQLite3 だとトランザクションの入れ子が出来なかった(例外が発生する)のでこうしてます。
一応 should_not_receive で特定の処理から先には進んでないことは確認しているし、 エラーメッセージも確認しているのでこれでテストとしては良さそう。
あとは、実装コードの最初の方で呼んでる処理をモック化すればいいと思う。
これをモック化すると、通しのテストはどうすればいいのだろう、というのが今の疑問。
describe BatchController do
describe "POST create" do
describe "by login user" do
describe "when posted data was invalid (subject)" do
before do
Question.should_not_receive(:create!)
Choice.should_not_receive(:create!)
unless sqlite3?
ActiveRecord::Base.connection.should_receive(:rollback_db_transaction)
end
end
before do
login_as :quentin
post :create, :batch => { :body => INVALID_DATA_WITHOUT_TITLE }
end
it "should have error message" do
flash[:error].should == 'invalid data.'
end
it "should redirect to 'subject/index'" do
response.should redirect_to(subjects_path)
end
end
end
end
end


