水豚与子域名 – 默认主机
我有一个应用程序,使用子域来切换数据库(多租户)。 我正在尝试使用Capybara进行集成testing,它确实依赖于子域。
我的理解是,设置Capybara.default_host=
将使所有的请求来自这个主机。 这似乎并非如此。 在这篇文章中 ,作者build议只需访问一个主机的显式url,但是如果我正在浏览所有的地方,这会变得有点烦人。 我想设置主机,然后能够按预期使用我的导轨path。 不知道我做错了什么,但这是我所尝试的:
# spec_helper.rb RSpec.configure do |config| config.before(:each, :type => :request) do Capybara.default_host = 'http://app.mydomain.com' end end # in some_integration_spec.rb before do puts "Capybara.default_host: #{Capybara.default_host}" puts "some_app_url: #{some_app_url}" end
这产生了输出:
Capybara.default_host: http://app.mydomain.com some_app_url: http://www.example.com/some_path
我究竟做错了什么? default_host
似乎什么都不做。 正如我所说,我不想说visit(Capybara.default_host + some_app_path)
,因为每次都有点烦人。 为什么这个default_host选项存在?
我不确定default_host
用途,但是app_host
你的需要。 我发现我首先需要调用rails会话方法host!
以设置将被传递给请求对象中的控制器的主机string。
然后你需要设置Capybara.app_host
告诉水豚通过networking服务器调用你的应用程序,而不是只是在进行调用。 如果你不这样做,那么水豚会遇到redirect,并在第二个请求中丢弃主机信息。
我不知道为什么这不会自动处理事情的Rails request
结束,但我发现,除非我明确地在两个地方设置主机,然后我得到不一致的结果。
def set_host (host) host! host Capybara.app_host = "http://" + host end before(:each) do set_host "lvh.me:3000" end
那么你可以使用相对path来访问页面。
更新:
水豚2.x和rspec导轨2.12.0引入“function”规格运行水豚验收testing。 rspec-rails
的新FeatureExampleGroup
模块与RequestExampleGroup
不同,不再有权访问机架testinghost!
方法。 现在,您想要使用default_url_options
:
def set_host (host) # host! host default_url_options[:host] = host Capybara.app_host = "http://" + host end
当您需要更改URL以包含子域名时,可以在步骤定义中指定app_host
。 使用像lvh.me
这样的域名,因为它指向127.0.0.1
:
Capybara.app_host = "http://#{subdomain}.lvh.me"
app_host
认为,当你指定一个app_host
来testing运行在端口80上的远程服务器时,在我们的例子中,我们正在testing一个在app_host
指定的随机端口上运行的本地应用程序。 要解决这个问题,请在env.rb
文件中添加以下行:
Capybara.always_include_port = true
现在,当你访问你的应用程序的页面
visit '/page'
…该url将指定子域以及应用程序运行的端口。
仅供参考:这对我使用水豚2.0.2。
这家伙在这里有正确的答案:
http://zurb.com/forrst/posts/Testing_Subdomains_in_Capybara-g4M
你想要做的
Capybara.current_session.driver.reset! Capybara.default_host = 'http://app.mydomain.com'
这与你的情况并不完全一样,但这可能会帮助一些人:
对于我目前的项目,我使用许多子域名。 testing套件还必须在不同的端口上运行。
解决scheme取决于你正在运行的水豚的版本。
对于目前的最新版本,我把它放在custom_env.rb中:
Capybara.server_host = 'myapp.dev' Capybara.server_port = 9887 Capybara.run_server = true # I don't remember what this was for. Another team member wrote this part... module ActionDispatch module Integration #:nodoc: class Session def host [Capybara.server_host, Capybara.server_port].join(':') end end end end
server_host
豚1.1.2,我不得不作出上述改变,但server_host
变成app_host
,并修改像这样的gemlib / app_host
/ server.rb:
def url(path) .. if path =~ /^http/ path else # Was this (Capybara.app_host || "http://#{host}:#{port}") + path.to_s (Capybara.app_host || "http://#{host}") + ":#{port}" + path.to_s end end
作为:
- 水豚(2.4.1)
-
水豚-webkit(1.3.0)
Capybara.server_host = "example.com" Capybara.server_port = 3050 Capybara.run_server = true Capybara.javascript_driver = :webkit #requires capybara-webkit