Я тестирую свои приложения 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.
Спасибо заранее и любезны!