アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

RSpec での悲観ロックのテスト

こんにちは、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

以上、エンジニアとかプログラマとか募集中 です!