API của tôi cho phép người dùng mua một số mặt hàng duy nhất, trong đó mỗi mục chỉ có thể được bán cho một người dùng. Vì vậy, khi nhiều người dùng cố gắng mua cùng một mặt hàng, một người dùng sẽ nhận được phản hồi: ok và người dùng khác sẽ nhận được phản hồi too_late.Yêu cầu Capybara đồng thời nhiều luồng?
Hiện tại, có vẻ như có lỗi trong mã của tôi. Một điều kiện chủng tộc. Nếu hai người dùng cố gắng mua cùng một mục cùng một lúc, cả hai đều nhận được câu trả lời ok. Vấn đề này có thể tái sản xuất rõ ràng. Bây giờ tôi đã viết một bài kiểm tra đơn giản cố gắng tái tạo nó qua rspec:
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
Có vẻ như không thực hiện các truy vấn cùng một lúc. Để kiểm tra điều này, tôi đặt đoạn mã sau vào hành động điều khiển của tôi:
puts "Is it concurrent?"
sleep 0.2
puts "Oh Noez."
Dự kiến sản lượng sẽ là, nếu yêu cầu được đồng thời:
Is it concurrent?
Is it concurrent?
Oh Noez.
Oh Noez.
Tuy nhiên, tôi nhận được kết quả như sau:
Is it concurrent?
Oh Noez.
Is it concurrent?
Oh Noez.
Điều này cho tôi biết rằng các yêu cầu capybara không được chạy đồng thời, nhưng mỗi lần một yêu cầu. Làm cách nào để yêu cầu capabara của tôi đồng thời?
Ví dụ mã ở trên của bạn không giống như DSL hiện tại của Capybara đối với tôi. Nó trông giống như một thử nghiệm điều khiển đơn giản bằng cách sử dụng Rack :: Test. Đây co thật sự la bản chât của no? –