2010-05-15 19 views
5

Bir testte bir yarış durumunu yeniden oluşturmaya çalışıyorum, bu yüzden bazı çözümleri deneyebilirim. Bunu sınamada oluşturduğum iş parçacıklarında, ActiveRecord her zaman sayım için 0 değerini döndürür ve bulur. Örneğin, tablodaki 3 satır "Foo'larınız" ile:rspec'te çok iş parçacıklı ActiveRecord istekleri

it "whatever" do 
    puts Foo.count 
    5.times do 
     Thread.new do 
     puts Foo.count 
     end 
    end 
    end 

,

3 
0 
0 
0 
0 
0 

test.log beklenen sorgu gösterir yazdırılır beklenen 6 kez:

SELECT count(*) AS count_all FROM `active_agents` 

Herhangi fikir burada neler oluyor?

cevap

12

ActiveRecord her iş parçacığı için özel bir veritabanı bağlantısı açtığını varsayarım. Her bir RSpec örneği bir işlemin içine sarıldığı için, diğer iş parçacıkları değişiklikleri göremeyebilir.

Bu özellik için işlemsel donanım devre dışı bırakmayı deneyin.

describe "thread test" do 
    self.use_transactional_fixtures = false 

    it "whatever" do 
    puts Foo.count 
    5.times do 
     Thread.new do 
     puts Foo.count 
     end 
    end 
    end 
end 
+0

Jeem'in tanımlamasıyla aynı problemi yaşadım ve @ henning-koch'un çözümü benim için çözdü. Yukarıdaki çözümüne kod ekledim (bir başkası tarafından kabul edilmesi gerekiyor). –

+0

Çok hoş bir numara! –

İlgili konular