水豚与子域名 – 默认主机

我有一个应用程序,使用子域来切换数据库(多租户)。 我正在尝试使用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.xrspec导轨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