Hi All. I want to test by multi thread.(functional test) as below
* test class ItemControllerTest < ActionController::TestCase
self.use_transactional_fixtures = false POOL_SIZE = 5
def 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.