У меня есть такой код:
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. Это отдельная жемчужина, которую я пишу.