Как выполнить функциональное тестирование маршрутов Rails с ограничениями?

У меня есть приложение Rails 3, и я пытаюсь написать тесты для всей маршрутизации.

Представьте себе этот очень простой маршрут:

resources :jobs, :constraints => {:id => /\d+/}

Теперь я хочу проверить это. В моем функциональном тесте достаточно просто написать утверждение, используя встроенные утверждения в Rails для положительного случая:

assert_routing "jobs/4", { :controller => "jobs", :action => "show", :id => "4" }

Каков наилучший способ утверждения негатива? А именно, что «jobs/wibble», не нарушив ограничение, не маршрутизируется, а возвращает ошибку? Есть ли простой способ реализовать «assert_not_routing» или что-то в этом роде? Кто-нибудь занимался этим раньше?


person Tom Morris    schedule 03.07.2012    source источник


Ответы (2)


Решение, которое я нашел в конце концов, состоит в том, чтобы протестировать маршрутизацию действительных URL-адресов в функциональных тестах и ​​проверить немаршрутизацию недействительных URL-адресов в интеграционных тестах.

Я создал новый класс интеграционных тестов под названием RoutesTest и храню в нем все URL-адреса, которые никуда не должны направляться.

require 'test_helper'

class RoutesTest < ActionDispatch::IntegrationTest
  test "broken routes don't work" do
    assert_raise(ActionController::RoutingError) {
      get "/jobs/wibble"
    } 
  end
end

Я все еще проверяю допустимые маршруты в функциональных тестах. Вероятнее всего, здесь какая-то теология тестирования терпит неудачу: в произвольных и довольно нелепых теориях, которые мы придумываем о том, куда должны идти конкретные тесты в идее модуля, интеграции или функционала, это кажется немного странным. Но я лучше сделаю работу, чем буду спорить с людьми о проверке богословия. Вот как я это делаю.

person Tom Morris    schedule 04.07.2012
comment
Том, есть ли теология тестирования, по которой вы не используете rspec? relishapp.com/ rspec/rspec-rails/v/2-4/docs/routing-specs/. Или это не то, что вам нужно? (должен_не быть_маршрутизируемым) - person Chris S; 04.07.2012
comment
Основная причина, по которой я не использую RSpec, — это лень, а также неудачный опыт в прошлом, когда Cucumber вызывал хаос в моем приложении Rails 2.x. Я, вероятно, должен переключиться на RSpec. - person Tom Morris; 04.07.2012
comment
хорошо, тогда я проголосую за ваш ответ, так как он правильный, а также теперь он поставляется с добавленным пикантным дополнением, чтобы просто использовать rspec! - person Chris S; 04.07.2012

Вы пытались установить нулевой маршрут для пути?

person Pius Uzamere    schedule 03.07.2012