Hi All.
I want to test by multi thread.(functional test)
as below
-
test
class ItemControllerTest < ActionController::TestCaseself.use_transactional_fixtures = false
POOL_SIZE = 5def setup
@connection = ActiveRecord::Base.remove_connection
ActiveRecord::Base.establish_connection(@connection.merge({:allow_concurrency
=> true, :pool => POOL_SIZE}))
activate_authlogic
end
test “multi thread test” do
user = accounts(:one)
assert(AdAccountSession.create(user))
item = items(:one)
before_count = item.count
params = {:id => item.id.to_s, :count => 10}
threads = (1…5).map do
Thread.new do
10.times do
put :update, params
end
end
end
threads.each(&:join)
end
assert_equal before_count + 10 * 5, item.reload.count
end
- controller
class ItemsController < ApplicationController
def update
count = params[:count]
id = params[:id]
update_sql = “UPDATE items SET count = count + #{count} WHERE id =
#{id}”
Item.connection.update(update_sql)
redirect_to(@item, :notice => ‘Item was successfully updated.’)
return
end
end
But raise error
test_samaple(ItemsTransactionControllerTest):
AbstractController::DoubleRenderError: Render and/or redirect were
called multiple times in this action.
Please note that you may only call render OR redirect, and at most
once per action.
Also note that neither redirect nor render terminate execution of the
action,
so if you want to exit an action after redirecting, you need to do
something like “redirect_to(…) and return”.
This error isn’t raised in case of single thread(threads = (1…1).map
do)
How can I test by multi thread?
appreciate any help.
Thank you
Masaki.