тестирование отката и исключения - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть следующий (псевдо) код:

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 вместо этого, и все происходит с точностью до наоборот: я могу проверить, что премиальное время остается нетронутым, но на самом деле никаких исключений не возникает.

Можно ли поднять исключение и для проверки премиум-времени?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...