以下にリストされている仕様の実行中にエラーが発生しました。スレッドが完了するのを待たず、migrate メソッドのスタブを解除し、その結果スレッドの 1 つが実際のメソッドにヒットします。
レールがロードされている場合にのみ発生することに気付きました.レールがなくても正しく動作するか、単に速く終了します...
仕様:
it "should not allow infinit recursion" do
runner.stub(total_records: 4)
runner.stub(:fetch_records_batch).and_return([:one, :two])
runner.should_receive(:migrate).at_most(100).times
expect { runner.run }.to raise_error(Exception, /Migration fall into recursion/)
end
it "should pass"
1.should eq 1
end
抽出されたコード:
class Runner
def migrate(record)
raise NotImplementedError
end
def run
while have_records?(records = fetch_records_batch)
threads = []
records.each do |record|
threads << Thread.new(record) do |thread_record|
begin
result = migrate(thread_record)
rescue RuntimeError => exception
register_event :record_migration_error, thread_record, exception
end
end
recursion_preventer
end
threads.each(&:join)
end
end
def recursion_preventer
@counter ||= 0
@counter += 1
raise Exception, "Migration fall into recursion. Check logs." if @counter > (total_records * 1.1).round + 10
end
end