Mit meiner API können Benutzer bestimmte Unikate kaufen, wobei jeder Artikel nur an einen Benutzer verkauft werden kann. Wenn also mehrere Benutzer versuchen, den gleichen Artikel zu kaufen, sollte ein Benutzer die Antwort erhalten: ok und der andere Benutzer sollte die Antwort erhalten too_late.Multi-Threaded gleichzeitige Capybara Anfragen?
Jetzt scheint es einen Fehler in meinem Code zu geben. Eine Wettlaufbedingung. Wenn zwei Benutzer versuchen, den gleichen Artikel zur gleichen Zeit zu kaufen, erhalten beide die Antwort ok. Das Problem ist in der Produktion eindeutig reproduzierbar. Jetzt habe ich einen einfachen Test geschrieben, dass es über rspec zu reproduzieren versucht:
context "when I try to provoke a race condition" do
# ...
before do
@concurrent_requests = 2.times.map do
Thread.new do
Thread.current[:answer] = post "/api/v1/item/buy.json", :id => item.id
end
end
@answers = @concurrent_requests.map do |th|
th.join
th[:answer].body
end
end
it "should only sell the item to one user" do
@answers.sort.should == ["ok", "too_late"].sort
end
end
Es scheint, wie nicht ausgeführt, die Abfragen zur gleichen Zeit. Um dies zu testen, habe ich den folgenden Code in meine Controller-Aktion:
puts "Is it concurrent?"
sleep 0.2
puts "Oh Noez."
Erwartete Ausgabe wäre, wenn die Anforderungen sind gleichzeitig:
Is it concurrent?
Is it concurrent?
Oh Noez.
Oh Noez.
Allerdings bekomme ich folgende Ausgabe:
Is it concurrent?
Oh Noez.
Is it concurrent?
Oh Noez.
Was mir sagt, dass Capybara Anfragen nicht zur gleichen Zeit, aber nacheinander ausgeführt werden. Wie stelle ich meine CapaBara-Anfragen gleichzeitig?
Ihr Codebeispiel oben sieht für mich nicht wie das aktuelle Capybara DSL aus. Es sieht eher wie ein einfacher Reglertest mit Rack :: Test aus. Ist es das, was es ist? –