Как проверить ошибки 404 Sinatra::NotFound с помощью Rack::Test?

У меня есть приложение, которое вызывает 404 ошибки Sinatra::NotFound на производстве, когда маршрут отсутствует.

Тем не менее, следующий тест проходит:

it 'should not raise error' do
  expect{ get '/unknown_path' }.to_not raise_error
end

Почему в тесте не возникают ошибки 404 Sinatra::NotFound?

Следующее действительно вызывает ошибку и вызывает сбой теста:

get '/unknown_path' do
  raise 'error'
end

Как проверить ошибки 404 Sinatra::NotFound?

2 ответа

Проблема в том, что get /unknown_path' на самом деле не вызывает ошибку - он только получает 404 запроса.

Из Синатры: README

Обработчик ошибок вызывается каждый раз, когда возникает исключение из блока маршрута или фильтра. Объект исключения может быть получен из sinatra.error Переменная стойки...

Ваш тест проверяет фактическую ошибку (вот что raise_error делает), в то время как Синатра исправляет ошибку - в противном случае, каждый раз, когда кто-то 404-й сервер будет падать!

Обратитесь к руководству по тестированию Sinatra, чтобы узнать, как лучше составить тест. Основная идея заключается в том, что с помощью get ... в тесте устанавливает last_response локальная переменная, которую затем можно проверить на равенство и т. д.

last_response имеет status атрибут, так что (как уже упоминалось в другом ответе) вы можете просто проверить, чтобы убедиться, что last_response.status равно 404

Редактировать:

Я не совсем понял об этом. В режиме тестирования приложение действительно выдает ошибки.

Из настроек Синатры

повышение_отказа вызывает исключения (остановит приложение). Включено по умолчанию, когда для среды установлено значение "тест", в противном случае отключено.

Таким образом, вы на самом деле не хотите поднимать просто какую-либо ошибку, но raise Sinatra::NotFound.new("Not found!") поднять конкретный тип ошибки. Sinatra::NotFound ошибка вызовет обработчик 404. Синатра Обработка ошибок

Попробуй это:

get '/unknown_path'
assert_equal last_response.status, 404
Другие вопросы по тегам