2010-05-15 47 views
5

我試圖在測試中重新創建競爭條件,所以我可以嘗試一些解決方案。我發現在我的測試中創建的線程中,ActiveRecord對於計數總是返回0,對於發現則始終爲零。例如,對於3行的表格 「FOOS」:rspec中的多線程ActiveRecord請求

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中顯示預期的查詢時,預期的6倍:

SELECT count(*) AS count_all FROM `active_agents` 

不限想法這裏發生了什麼?

回答

12

我假設ActiveRecord爲每個線程打開一個專用的數據庫連接。由於每個RSpec示例都封裝在一個事務中,所以其他線程可能看不到更改。

嘗試禁用該規範的交易裝置。

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描述的一樣的問題,而@ henning-koch的解決方案爲我解決了這個問題。我在上面的代碼中添加了代碼(需要被其他人接受)。 – 2011-10-23 18:05:22

+0

非常好的把戲! – 2015-02-10 19:06:52