こんにちは、tahara です。
コードに account とか withdraw とか出てきたら悲観ロック(select for update)が必要ですね。
そのテストをするには次のものが必要になるかと思います。
- コミットが機能する
- 複数スレッドがそれぞれ別々のコネクションでトランザクション処理をする
RSpec で書くとこんな感じでしょうか。
describe 'Listing Transaction' do # ちゃんとコミットが機能するために self.use_transactional_fixtures = false describe '悲観ロックのテスト' do it 'お金消えたり増えたりしてないよね' do 10.times.map { |i| Thread.new do # スレッド毎に別々のコネクションを使う ActiveRecord::Base.connection_pool.with_connection do # テスト対象の悲観ロックをおこなう処理(foo.lack!) .... end end }.each(&:join) # お金消えたり増えたりしてないことを確認する expect(...).to eq(...) end end end
以上、エンジニアとかプログラマとか募集中 です!