2013-01-17 49 views
0

我有兩個ActiveRecord的模型,看起來像這樣:古怪的行爲用ActiveRecord和測試

class Foo < ActiveRecord::Base 
    after_commit { puts 'after commit in Foo' } 
end 

class Bar < ActiveRecord::Base 
    after_commit { puts 'after commit in Bar' } 
end 

然後,我有一個看起來像這樣兩個測試:

測試/單位/ foo_test.rb

class FooTest < ActiveSupport::TestCase 
    setup do 
    puts 'Creating Foo' 
    @foo = Foo.create 
end 

should 'foo exists' do 
    assert [email protected]? 
end 
end 

測試/單元/ bar_test.rb:

class BarTest < ActiveSupport::TestCase 
    self.use_transactional_fixtures = false 

    setup do 
    pits 'Creating Bar' 
    @bar = Bar.create 
end 

should 'bar exists' do 
    assert [email protected]? 
end 
end 

但是當我運行這些測試在一起我得到以下輸出:

Creating Foo 
Creating Bar 
after commit in Foo 
after commit in Bar 

我是在默認情況下Rails的包裹活動記錄的東西在一個事務中,然後在每次測試結束時做了回滾印象。我已經嘗試明確地設置use_transactional_fixtures = true,但沒有取得任何結果。

我的問題是這裏發生了什麼?看起來活動記錄正在爲Bar創建回調鏈,然後在測試完成後它不會被清除。我也試過使用DatabaseCleaner,並在測試結束時在拆卸回調中顯式銷燬@bar,但沒有任何工作。

編輯:看起來像它可以在導軌的一個問題:https://github.com/rails/rails/pull/3300

回答

1

原來有一個在軌導致的交易記錄,要堅持即使在實際的數據庫已回滾的錯誤。這裏是討論:https://github.com/rails/rails/pull/3300

您可以用下面的方法(如在github上線提示)來清除活動事務之間如果需要測試運行:

def teardown_fixtures 
     if run_in_transaction? && ActiveRecord::Base.connection.open_transactions != 0 
    ActiveRecord::Base.connection.rollback_db_transaction 

    ActiveRecord::Base.connection.send(:rollback_transaction_records, true) 
    if ActiveRecord::Base.connection.instance_variable_get('@_current_transaction_records') 
     ActiveRecord::Base.connection.decrement_open_transactions 
    end 

    ActiveRecord::Base.clear_active_connections! 
    end 
end