Как я могу утверждать, что ни один маршрут не соответствует тесту интеграции Rails? - PullRequest
6 голосов
/ 26 января 2011

У меня есть тест интеграции Rails 3, который проверяет мои маршруты.Он содержит такие тесты, как:

assert_routing(
    "/#{@category.url.path}/#{@foo.url.path}",
    { :controller => 'foo', :action => 'show', :category => @category.to_param, :foo => @foo.to_param }
)

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

assert_not_recognized('/adfhkljkdhasjklhjkldfahsjkhdf')

Любые идеи, за исключением включения assert_recognizes в блок assert_raises (что на самом деле не так уж и плохо, теперь, когда я об этом думаю)?1007 *

Ответы [ 4 ]

10 голосов
/ 09 февраля 2014

Есть аналогичный способ проверить это в Rails 4 , утверждая исключение UrlGenerationError :

def test_no_routes_match_when_neither_foo_nor_bar_exist
  assert_raises(ActionController::UrlGenerationError) do
    get '/category/this-is-neither-a-foo-nor-a-bar'
  end
end
9 голосов
/ 26 января 2011

Я закончил тем, что сделал это:

  def test_no_routes_match_when_neither_foo_nor_bar_exist
    assert_raises(ActionController::RoutingError) do
      assert_recognizes({}, '/category/this-is-neither-a-foo-nor-a-bar')
    end
  end

Немного глупо, но это делает работу.

Обратите внимание, что это не работает с Rails 4 См. Ответ ниже для решения Rails 4.

2 голосов
/ 23 ноября 2015

При вызове #recognize_path вы не получите false . Вместо этого вы получите ошибку, но затем вы нашли подсказку, которую искали.

test "No routes match when neither_foo_nor_ bar exist" do
  begin 
    assert_not(Rails.application.routes.recognize_path(
        'category/this-is-neither-a-foo-nor-a-bar'))
  rescue ActionController::RoutingError => error
    assert error.message.start_with? "No route matches"
  end
end
0 голосов
/ 18 октября 2012

Вы пробовали method_missing(selector, *args, &block)? Определено Здесь

...