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

区分
Rails
報告者

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

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

トップページに戻る

技師部隊からの
お知らせ

【求人】エンジニア募集しています。

本頁の来客数
八十七万千百七十六名以上(計測停止中)

メンバー一覧

アクトインディ技師部隊員名簿

アクトインディ技師部元隊員

アクトインディへ

カテゴリー

アクトインディ

aaaa