Ruby on Rails + Parallel gemで実装した処理をRspecでは同じスレッド上で動かす

Ruby on Rails + Parallel gemで実装した処理をRspecでは同じスレッド上で動かす

事象

以下のようにRailsでParallel gemにて処理を並列スレッドで実行しているとき、

def index
procs = [
-> { hoge1 },
-> { hoge2 },
-> { hoge3 }
]
result = Parallel.map(procs, in_threads: 3, &:call)
end

これをRspecでテストしようとするとテストが永遠に終わらなくなってしまう

理由としては、letやsubjectが変数に対してロックを獲得するため、複数スレッドで変数の参照待ちになりデッドロックが発生してしまうのが原因

解決

じゃあどうすればいいかと言うと、Rspec上では直列で処理を実行するようParallelをモックして、ブロックを呼び出すだけにする

describe '#index' do
subject { get hoges_path }
# Parallel.mapの引数で渡された配列をmapしてcallするだけ
before { allow(Parallel).to receive(:map) { |procs| procs.map(&:call) } }
it_behaves_like 'return success'
end

これにて一件落着