事象
以下のように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これにて一件落着