Как проверить ошибки 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 запроса.
Обработчик ошибок вызывается каждый раз, когда возникает исключение из блока маршрута или фильтра. Объект исключения может быть получен из
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