我已成功添加了在我的应用程序中使用动态子域的功能。问题是当我运行我的Cucumber测试时,当我的应用程序执行包含子域的redirect_to时,我收到以下错误:
features/step_definitions/web_steps.rb:27
the scheme http does not accept registry part: test_url.example.com (or bad hostname?)
我有一个注册控制器操作,用于创建用户和所选帐户,并根据用户在注册表单中选择的子域指定子域,将用户重定向到注销方法。以下是创建和保存用户和帐户模型后发生的重定向操作的代码:
redirect_to :controller => "sessions", :action => "destroy", :subdomain => @account.site_address
以下是我的rails 3路线:
constraints(Subdomain) do
resources :sessions
match 'login', :to => 'sessions#new', :as => :login
match 'logout', :to => 'sessions#destroy', :as => :logout
match '/' => 'accounts#show'
end
这是我到目前为止在上面的约束中指定的Subdomain类的代码:
class Subdomain
def self.matches?(request)
request.subdomain.present? && request.subdomain != "www"
end
end
我将UrlHelper添加到ApplicationController:
class ApplicationController < ActionController::Base
include UrlHelper
protect_from_forgery
end
这是以上UrlHelper类的代码:
module UrlHelper
def with_subdomain(subdomain)
subdomain = (subdomain || "")
subdomain += "." unless subdomain.empty?
[subdomain, request.domain, request.port_string].join
end
def url_for(options = nil)
if options.kind_of?(Hash) && options.has_key?(:subdomain)
options[:host] = with_subdomain(options.delete(:subdomain))
end
super
end
end
上面的所有代码都允许我在本地浏览器中运行子域名。当我运行我的Cucumber测试时,会发生上述问题。测试点击注册按钮,然后调用redirect_to并抛出上面列出的异常。
这是我的gem文件的样子:
require 'subdomain'
SomeApp::Application.routes.draw do
resources :accounts, :only => [:new, :create]
match 'signup', :to => 'accounts#new'
constraints(Subdomain) do
resources :sessions
match 'login', :to => 'sessions#new', :as => :login
match 'logout', :to => 'sessions#destroy', :as => :logout
match '/' => 'accounts#show'
end
end
请您知道另一种让我的测试工作的方法吗?我会对修复或我可以在不使用子域的情况下测试方法的方式感兴趣(例如,检索帐户名称的模拟方法)。
答案 0 :(得分:1)
我的代码中有相同的模式。我使用Capybara(但不是Cucumber),我能够像这样绕过它:
# user creates an account that will have a new subdomain
click_button "Get Started"
host! "testyco.myapp.com"
# user is now visiting app on new subdomain
visit "/register/get_started/" + Resetkey.first.resetkey
assert_contain("Get Started Guide")
主持人!命令有效地更改了测试请求中应用程序显示的主机。
编辑:刚刚意识到这与webrat一起工作,但不是capybara(我现在正在使用两者,现在逐步淘汰webrat。)我在capybara中这样做的方法是点击链接到新域名(capybara)遵循它)或: visit "http://testyco.myapp.com/register"
编辑:另一个更新。找到一种方法,无需在每个事件中使用完整的URL。
host! "test.hiringthing.com"
Capybara.app_host = "http://test.hiringthing.com"
在测试设置中。