2010-05-15 14 views
5

Próbuję odtworzyć warunki wyścigu w teście, więc mogę wypróbować niektóre rozwiązania. Uważam, że w wątkach, które tworzę w moim teście, ActiveRecord zawsze zwraca 0 dla zliczeń i zero dla znalezisk. Na przykład, z 3 wierszy w tabeli "Foos":Wielowątkowe żądania ActiveRecord w rspec

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

drukuje

3 
0 
0 
0 
0 
0 

test.log pokazuje oczekiwaną zapytanie, oczekiwane 6 razy:

SELECT count(*) AS count_all FROM `active_agents` 

Any pomysł, co tu się dzieje?

Odpowiedz

12

Zakładam, że ActiveRecord otwiera dedykowane połączenie z bazą danych dla każdego wątku. Ponieważ każdy przykład RSpec jest zawijany wewnątrz transakcji, inne wątki mogą nie widzieć zmian.

Spróbuj wyłączyć urządzenia transakcyjne dla tej specyfikacji.

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

Miałem ten sam problem, który opisuje jeem, a rozwiązanie @ henning-koch rozwiązało je dla mnie. Dodałem kod do powyższego rozwiązania (musi to być zaakceptowane przez kogoś innego). –

+0

Bardzo ładna sztuczka! –

Powiązane problemy