Я тестирую свои приложения 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), но не влияет на маршрутизацию в этом случае.
Я не знаю, отличается ли ситуация в интеграционных тестах.
Итак, два основных вопроса:
Я хочу попробовать разные подходы (Capybara и друзья), но я не хочу менять свою структуру тестирования (уже мое время RSpec), так как в остальном я очень доволен Test :: Unit.
Заранее спасибо и с наилучшими пожеланиями!