4
동시성에 관한 테스트를 설정하려고합니다. 최종 목표는 ActiveRecord skips locked
records in PostgreSQL을 사용하여 서비스를 테스트하는 것입니다.RSpec에서 Thread.new와의 동시성 테스트
이 두 콘솔에서 잘 작동 :
# in console 1
queue = MyFancyQueue.first
item_1 = queue.items.first
item_1.with_lock { sleep 30 } # locks item_1 for 30 seconds
# in console 2, while item_1 is locked
queue = MyFancyQueue.first
queue.items.first # => item_1
queue.items.lock('FOR UPDATE SKIP LOCKED').first # => item_2
을하지만, RSpec에와, 나는 Thread.new
에서 실행되는 코드가 어떤 기록을 찾을 수없는, 뭔가 같은 :
let(:queue) { MyFancyQueue.create }
let!(:items) { create_list(:item, 2, queue: queue) }
context 'with first item locked' do
it 'returns the second item' do
Thread.new { queue.items.first.with_lock { sleep 30 } }
expect(queue.items.lock('FOR UPDATE SKIP LOCKED').first).to eq items.last
end
end
는를 슬로우 queue.items.first
을 찾을 수 없습니다. pry
을 사용하여 스레드를 살펴볼 때 항목을 볼 수 없습니다.
RSpec으로 어떻게 효과적으로 테스트 할 수 있습니까?
은 rails_helper.rb에서'config.use_transactional_fixtures = false'입니까? –
@OlegSobchuk true로 설정 됨 –
'false'로 변경하고 다시 시도하십시오. –