Подтвердить что ты не робот

Как протестировать сбор исключений в 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, но мой тестовый код говорит мне, что ничего не было поднято. Как я могу это исправить? Что я не так?

4b9b3361

Ответ 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