Тестирование маршрутов с ограничением поддомена в Rails 3

Я тестирую свои приложения Rails с помощью Test :: Unit. Я часто сталкиваюсь с проблемой тестирования маршрутов моего приложения, для которой я еще не нашел решения.

В настоящее время я работаю над приложением, которое использует поддомены в стиле Basecamp для различения учетных записей.

Там - это маршруты, для которых требуется поддомен

constraints(SubdomainRoute) do
  get  "/login" => "user_sessions#new", :as => :login
  get  "/logout" => "user_sessions#destroy", :as => :logout
  ...
end

, а также маршруты, к которым можно получить доступ только без поддомена

constraints(NoSubdomainRoute) do
  match "/" => "public#index", :as => :public_root
  match "/signup" => "public#signup", :as => :signup
  ...
end

. Класс SubdomainRoute определяется как:

class SubdomainRoute
  def self.matches?(request)
    request.subdomain.present? && request.subdomain != "api" && request.subdomain != "www"
  end
end

Класс NoSubdomainRoute в значительной степени делает противоположное.

Маршрутизация работает, как ожидалось. , но как мне протестировать их с помощью Test :: Unit?

В функциональных тестах я могу сделать что-то вроде

assert_routing "/signup", :controller => "public", :action => "signup"

, но я не могу предоставить поддомен, так что на самом деле это только внутреннее тестирование Rails, которое ничего не добавляет к тестированию моего приложения . В этом случае я хочу проверить, доступен ли signup_path / signup_url с поддоменом или без него.

В коде что-то вроде этого

assert_raise(ActionDispatch::RoutingError) { get "http://account.test.host/signup" }
get "http://www.test.host/signup"
assert_response :success

get не работает в этом случае, потому что Test :: Unit рассматривает весь URL как действие контроллера (...: action => "http://account.test.host/signup").

Setting

@request.host = "subdomain.test.host"

влияет только на код вашего внутреннего контроллера (например, получение текущей учетной записи путем извлечения поддомена из host), но не влияет на маршрутизацию в этом случае.

Я не знаю, отличается ли ситуация в интеграционных тестах.

Итак, два основных вопроса:

  1. Где маршруты должны быть testet в целом?
  2. Как они тестируются в этом особом случае?

Я хочу попробовать разные подходы (Capybara и друзья), но я не хочу менять свою структуру тестирования (уже мое время RSpec), так как в остальном я очень доволен Test :: Unit.

Заранее спасибо и с наилучшими пожеланиями!

20
задан Michael Trojanek 12 June 2011 в 23:35
поделиться