Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
954 views
Welcome To Ask or Share your Answers For Others

1 Answer

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]


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...