Я тестирую свои приложения на 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").
Настройка
@request.host = "subdomain.test.host"
влияет только на код вашего внутреннего контроллера (например, получение текущей учетной записи)путем извлечения субдомена из хоста), но не влияет на маршрутизацию в этом случае.
Я не знаю, отличается ли ситуация в интеграционных тестах.
Таким образом, два основных вопроса
- Где - маршруты, которые должны быть проверены в целом?
- Как они проверяются в отношении этого особого случая?
Я собираюсь опробовать разные подходы (Capybara и друзья), но я не хочу переключать свою среду тестирования (у меня уже было время RSpec), так как в остальном я очень доволен Test :: Unit.
Заранее спасибо и кс уважением!