Как проверить, что RuntimeError правильно использует интерполяцию строк в Ruby? - PullRequest
0 голосов
/ 21 января 2019

У меня есть метод, который записывает изменение конкретной записи в моей базе данных, но сначала он проверяет тип категории на достоверность, прежде чем идти дальше. Если это возвращает false, возникает ошибка.

class UpgradePackageRecorder

  CATEGORIES = [ an array of categories here ... ]

  def initialize(category)
    @category = category
  end

  def record_change
    unless valid_category?
      raise "#{category} is not a recognized category"
    end

    other_methods
  end

  private

  def valid_category?
    CATEGORIES.include?(category)
  end

end

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

RSpec.describe UpgradePackageRecorder do
  describe '#record_change' do
    context 'the package type is invalid' do
      it 'raises an error' do

       recorder = UpgradePackageRecorder.new('Bronze')

       expect { recorder.record_change }.to raise_error(RuntimeError, /bronze is not a recognized category/)
      end
    end
  end
end

Когда я запустил тест, я получил эту ошибку:

Failure/Error: raise "#{category} is not a recognized category"

RuntimeError:
  bronze is not a recognized category

Почему интерполяция строк проявляется так? Я тоже пробовал как category + ' is not a recognized category но это не решило проблему.

Чтобы сделать это еще более запутанным, я взял интерполяцию строк и все еще видел проблему:

Failure/Error: raise "Unrecognized category"

RuntimeError:
  Unrecognized category

1 Ответ

0 голосов
/ 22 января 2019

Я понял это!

Синтаксис, который сработал для меня, был таким:

it 'raises an error' do

  expect do
    UpgradePackageRecorder.new(
      'Bronze'
    ).record_change
  end.to raise_error(
    RuntimeError, /bronze is not a recognized category/
  )

end

Кроме того, у меня был еще один expect в том же блоке it, который я удалил. Он проверял, был ли метод record_change создан для создания определенного объекта.

...