Как протестировать сбор исключений в Rails/RSpec?
Существует следующий код:
def index
@car_types = car_brand.car_types
end
def car_brand
CarBrand.find(params[:car_brand_id])
rescue ActiveRecord::RecordNotFound
raise Errors::CarBrandNotFound.new
end
Я хочу проверить его через RSpec. Мой код:
it 'raises CarBrandNotFound exception' do
get :index, car_brand_id: 0
expect(response).to raise_error(Errors::CarBrandNotFound)
end
CarBrand с id равным 0 не существует, поэтому мой код контроллера вызывает ошибки:: CarBrandNotFound, но мой тестовый код говорит мне, что ничего не было поднято. Как я могу это исправить? Что я не так?
Ответы
Ответ 1
Чтобы обработать ошибки обработки ошибок, ваши ожидания должны быть заданы на блоке; оценка объекта не может вызвать ошибку.
Итак, вы хотите сделать что-то вроде этого:
expect {
get :index, car_brand_id: 0
}.to raise_error(Errors::CarBrandNotFound)
Подробнее см. Ожидайте ошибку.
Я немного удивлен тем, что вы не получаете никаких исключений, связанных с вашими результатами.
Ответ 2
Для меня работало ожидать {} и не ожидать().
Ответ 3
get :index
никогда не будет создавать исключение - он скорее установит ответ как ошибку 500, так как реальный сервер будет делать.
Вместо этого попробуйте:
it 'raises CarBrandNotFound exception' do
controller.params[:car_brand_id] = 0
expect{ controller.car_brand }.to raise_error(Errors::CarBrandNotFound)
end