Я реализовал Оптимистическую блокировку для состояния гонки.Если lock_version не совпадает с обновленной lock_version в базе данных, то триггер будет инициирован трижды.Можете ли вы предложить, как проверить это событие повтора.
Примечание: я не могу изменить частный метод2
Публичный
def method1
begin
method2
rescue Exception => e
end
end
Личный
def method2
tries = 0
begin
raise Product::StaleObjectError.new("Product is changed while you were editing") if stale_object?
// Do some work
raise Exception.new("Total amount used is greater than approved") if total_approved < 0
// Save Product
rescue Product::StaleObjectError => e
if tries < MAX_RETRIES
tries += 1
sleep(1 + tries)
reload
retry
else
raise Product::StaleObjectError("Product is changed while you were editing")
end
end
attributes
end
Контрольный пример:
it 'method1 should call three times if there is stale_object' do
prod_v1 = Car.find(@car.id)
prod_v1.stub(:stale_object?).and_return true
prod_v1.method1
expect{prod_v1}.to receive(:method2).exactly(3).times
end
Я получаю следующую ошибку для контрольного примера
Failure/Error: expect{car_v1}.to receive(:method2).exactly(3).times
(#<Proc:).method2(any args)
expected: 2 times with any arguments
received: 0 times with any arguments