У меня есть следующий (псевдо) код:
def upgrade_to_ultimate
active_order = @user.single_active_order
UpgradeService.upgrade_to_ultimate(active_order)
render 'accounts/show'
rescue BTR::UpgradeService::UpgradePaymentFailed
error_code(code: 'ord_010')
end
и услуга:
order.transaction do
# close current order
# remove premium time from current order
# create new_order
response = charge_new_order
raise BTR::UpgradeService::UpgradePaymentFailed if response.refusal_reason.present?
end
в основном, в процессе обновления мы удаляем все премиальное время из текущего заказа и создаем новый заказ, но если мы пытаемся взимать новый заказ, и он терпит неудачу, я должен откатиться, чтобы пользователь не потерял никакого премиального времени и все остается как есть.
Это работает, как и ожидалось, но я могу найти простой способ проверить.
Я пробовал это:
context 'when the upgrade payment fails' do
let(:fake_cse) { create(:adyen_cse_response, :failed) }
it 'raises an error' do
allow_any_instance_of(ChargeOrderService).to receive(:charge_order).and_return fake_cse
expect { subject }.to raise_error(UpgradeService::UpgradePaymentFailed)
end
it 'does not change premium time' do
allow_any_instance_of(ChargeOrderService).to receive(:charge_order).and_return fake_cse
expect { subject }.not_to change { premium_order.reload.paid_premium_until }
end
end
и первый проход теста (возникает ошибка), но я не могу проверить второй случай (it does not change premium time
), потому что, конечно, возникла ошибка.
Я попытался повысить ActiveRecord::Rollback
вместо этого, и все происходит с точностью до наоборот: я могу проверить, что премиальное время остается нетронутым, но на самом деле никаких исключений не возникает.
Можно ли поднять исключение и для проверки премиум-времени?