#ruby-on-rails #testing #rescue
#ruby-on-rails #тестирование #спасение
Вопрос:
Rails 3, похоже, игнорирует мой обработчик rescue_from, поэтому я не могу протестировать свое перенаправление ниже.
class ApplicationController < ActionController::Base
rescue_from ActionController::RoutingError, :with => :rescue_404
def rescue_404
flash[:notice] = "Error 404. The url <i>'#{env["vidibus-routing_error.request_uri"]}'</i> does not exist on this website."
redirect_to root_path
end
end
Как в функциональных, так и в интеграционных тестах это rescue_from игнорируется, и возникает ошибка:
ActionController::RoutingError: No route matches "/non_existent_url"
test/integration/custom_404_test.rb:5:in `test_404'
Как я могу убедиться, что это правильно «поймано» в тесте?
Ответ №1:
Rails 3 обрабатывает ActionController::RoutingError
промежуточное программное обеспечение, поэтому ApplicationController::rescue_from
не видит исключения. Основная команда Rails рекомендует использовать универсальный маршрут в нижней части routes.rb
(проблема с GitHub), пока они не примут решение об исправлении.
Один из вариантов — использовать универсальный маршрут для обработки ошибок маршрутизации, а затем вручную вызвать исключение для попадания rescue_from
(код из моего сообщения в блоге об этой проблеме):
# routes.rb
match "*path", :to => "application#routing_error"
# application_controller.rb
rescue_from ActionController::RoutingError, :with => :render_not_found
def routing_error
raise ActionController::RoutingError.new(params[:path])
end
def render_not_found
render :template => "misc/404"
end