Написание теста RSpec для спасенного исключения - PullRequest
0 голосов
/ 29 октября 2019

У меня есть такой код:

module Empiric
  module_function

  def gem_version(name)
    Gem.loaded_specs[name].version
  rescue NoMethodError
    raise NoMethodError, "No gem loaded for #{name}"
  end
end

Это предназначено для поиска загруженного камня и определения версии, если камень найден. В моем проекте, например, драгоценного камня Капибара НЕ будет, так что это работает:

Empiric.gem_version("capybara")

Когда я говорю, что это "работает", я имею в виду, что оно вызывает соответствующее исключение. Я пытаюсь создать для этого тест RSpec, и я придумал следующее:

it "indicates if a dependent gem is not found" do
  expect {
    Empiric.get_version("capybara")
  }.to raise_error NoMethodError
end

Тест пройден ... однако тестовое покрытие указывает на то, что моя часть raise не покрывается.

Тем не менее, если я вместо этого скажу .not_to raise_error NoMethodError, этот тест не пройден. Как это должно. Обратите внимание, что я изменил его на "not_to" вместо "to". Таким образом, это показывает, что тест на самом деле распознает, что была сгенерирована ошибка.

Это связано с тем, что я специально спасаю ошибку? Потому что строка rescue показывает, что она описана в отчете о тестовом покрытии, а оператор raise - нет, хотя я проверял, что это действительно происходит.

С точки зрения попытки ответитьмой собственный вопрос, я сталкивался с этим ( Как записать rspec для тестирования блока восстановления .?), но это решение, похоже, не сработало для меня. Я также посмотрел на это ( Как проверить спасательный блок метода с помощью rspec mocks 3.3 ), что также мало что дает для меня. Аналогично для этого ( Rspec: тестирование спасения ) и этого ( Используя RSpec, как я могу проверить результаты блока исключений спасения ) и этого ( Rspec: Тестирование спасательного блока).

Просто чтобы прояснить, я не работаю в контексте Rails. Это отдельная жемчужина, которую я пишу.

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