2016-08-09 3 views
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으로 어떻게 효과적으로 테스트 할 수 있습니까?

+1

은 rails_helper.rb에서'config.use_transactional_fixtures = false'입니까? –

+0

@OlegSobchuk true로 설정 됨 –

+0

'false'로 변경하고 다시 시도하십시오. –

답변

1

DatabaseCleaner을 사용하는 경우이 테스트에는 DatabaseCleaner.strategy = :truncation을 사용해야합니다.

관련 문제