Throwing ActiveRecord::Rollback works, but not in tests.
I've had this problem before, am now having it again, and for some reason can't find any record of someone else having this problem.
I'm this is because tests do a rollback each time a test runs, and most databases don't support nested rolllbacks. However, I can't be the only person with test cases that involve a transaction rollback, so perhaps I am doing something wrong.
The following test case fails (uses shoulda library, though the same test fails with basic Test::Unit):
require 开发者_运维百科'test_helper'
class RollbackTest < ActiveSupport::TestCase
context "create a record and throw rollback" do
setup do
User.transaction do
User.create!
raise ActiveRecord::Rollback
end
end
should_not_change("count of users") { User.count }
end
end
however on the console:
?> User.transaction do
?> User.create!
>> raise ActiveRecord::Rollback
>> end
=> nil
>> User.count
=> 4
>> User.transaction do
?> User.create!
>> raise ActiveRecord::Rollback
>> end
=> nil
>> User.count
=> 4
You should turn off transactions in your test case:
class RollbackTest < ActiveSupport::TestCase
self.use_transactional_fixtures = false
[edit: as per @Conrad's comment it should be transactionAL
]
Actually the method to call is as follows:
class RollbackTest < ActiveSupport::TestCase
self.use_transactional_fixtures = false
not self.use_transaction_fixtures
(note the missing 'al')
精彩评论