2016-08-09 20 views
4

私は同時性に関するテストを設定しようとしています。最終目標は、ActiveRecord skips locked records in PostgreSQLを使用してサービスをテストすることです。RSpecでThread.newを使用して並行性をテストする

これは、2つのコンソールで素晴らしい作品: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 

、のようなもの:

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を必ず使用してください。

関連する問題