【发布时间】:2011-06-12 18:02:31
【问题描述】:
我正在使用 Test::Unit 测试我的 Rails 应用程序。我经常遇到的一个问题是测试我尚未找到解决方案的应用程序的路由。
目前,我正在开发一个使用 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"
仅对您的内部控制器代码有影响(例如,通过从主机中提取子域来获取当前帐户),但在这种情况下不影响路由。
我不知道在集成测试中情况是否有所不同。
所以两个主要问题是
- 一般来说路线应该是 testet 吗?
- 他们如何针对这种特殊情况进行了测试?
我愿意尝试不同的方法(Capybara 和朋友),但我不想切换我的测试框架(已经有我的 RSpec-time),因为我对 Test::Unit 非常满意。
在此先感谢您的问候!
【问题讨论】:
标签: ruby-on-rails testing subdomain