Rails rspec, как отлавливать ошибки AASM :: InvalidTransition и ActiveModel :: ValidationError - PullRequest
0 голосов
/ 05 июня 2019

Я хочу проверить метод вызова, где я использую rescue из двух ошибок - AASM::InvalidTransition и ActiveModel :: ValidationError и отправить его на rollbar.Если статус не существует, он должен показать ошибку проверки.

def call
  all_to_expire.each do |offer|
    begin
      offer.expire!(actor: self)
    rescue AASM::InvalidTransition, ActiveModel::ValidationError => e
      Rollbar.error(e)
    end
  end
end

Спецификации:

context 'when offer is invalid' do
    before do
      allow(BankOffers::CloseExpired).to receive(:new).and_return(invalid_expire)
      allow(invalid_expire).to receive(:call).and_raise(ActiveModel::ValidationError)
    end

    let(:invalid_expire) { instance_double(BankOffers::CloseExpired, call: nil) }

    it 'catch validation error' do
      expect do
        invalid_expire
      end.to raise_error(ActiveModel::ValidationError)
    end
  end
end

РЕДАКТИРОВАТЬ:

Все спецификацииобновлено - я думаю, что я должен использовать instance_double и выдать ошибку путем макета всего сервиса, но в конце я получил ошибку:

  expected ActiveModel::ValidationError but nothing was raised

1 Ответ

0 голосов
/ 06 июня 2019

Вы не должны издеваться или заглушать этот объект, потому что тогда вы ничего не будете тестировать, вы просто проверите, что вы настроили правильные макеты, которые бесполезны.

Я бы сделал что-то вроде:

context 'when offer is invalid' do
  it 'catch validation error' do
    # this is the tricky part, you are not showing your model so I don't
    # know what's an invalid AASM transition, but you should set an status
    # that can't be transitioned to "expired" here
    invalid_offer = create(:bank_offer,
      inquiry_process: process_past_date_of_interest,
      status:  <<<something here>>>)

    expect(Rollbar).to receive(:error)
    invalid_offer.call
  end
end

Вам необходимо создать действительную запись, но со статусом, который нельзя перевести в epired. Затем вы добавляете ожидание для объекта Rollbar и затем вызываете метод, который должен вызвать исключение AASM. Убедитесь, что ваш объект действителен, чтобы у вас не было других ошибок, скрывающих фактическую ошибку, которую вы тестируете.

Надеюсь, это поможет.

...