Ruby on rails 带子域的水豚-默认_主机

Ruby on rails 带子域的水豚-默认_主机,ruby-on-rails,integration-testing,capybara,Ruby On Rails,Integration Testing,Capybara,我有一个应用程序,使用子域切换数据库(多租户)。我正在尝试使用Capybara进行集成测试,它实际上非常依赖子域 我的理解是,将Capybara.default\u host=设置为某物将使我的所有请求都来自该主机。事实似乎并非如此。在中,作者建议只使用主机访问显式url,但如果我到处浏览,这会变得有点烦人。我只想设置主机,然后按照预期使用rails路径。不确定我做错了什么,但以下是我尝试过的: # spec_helper.rb RSpec.configure do |config| con

我有一个应用程序,使用子域切换数据库(多租户)。我正在尝试使用Capybara进行集成测试,它实际上非常依赖子域

我的理解是,将
Capybara.default\u host=
设置为某物将使我的所有请求都来自该主机。事实似乎并非如此。在中,作者建议只使用主机访问显式url,但如果我到处浏览,这会变得有点烦人。我只想设置主机,然后按照预期使用rails路径。不确定我做错了什么,但以下是我尝试过的:

# 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

我做错了什么<代码>默认主机似乎不起任何作用。正如我所说,我不想说
visit(Capybara.default\u host+some\u app\u path)
,因为每次都有点烦人。为什么还存在此默认主机选项?

我不确定
default\u host
的预期用途,但
app\u host
满足您的需要。我发现我首先需要调用rails会话方法
host
以设置将传递给请求对象中控制器的主机字符串

然后,您需要设置
Capybara.app\u host
,让Capybara通过web服务器调用您的应用程序,而不仅仅是在过程中进行调用。如果您不这样做,那么当水豚遇到重定向并在第二个请求中删除主机信息时,它就会跳转

我不确定为什么这不能自动处理Rails
请求
结束,但我发现,除非我在这两个位置明确设置主机,否则我会得到不一致的结果

def set_host (host)
  host! host
  Capybara.app_host = "http://" + host
end

before(:each) do
  set_host "lvh.me:3000"
end
然后,您可以使用相对路径访问页面

更新:

Capybara 2.xrspec rails 2.12.0引入了运行Capybara验收测试的“功能”规范。
rspec rails
中的新
功能示例组
模块与
RequestExampleGroup
不同,无法再访问机架测试
主机方法。现在您想使用
默认\u url\u选项

def set_host (host)
  # host! host
  default_url_options[:host] = host
  Capybara.app_host = "http://" + host
end

这家伙在这里有正确的答案:

你想做什么

Capybara.current_session.driver.reset!
Capybara.default_host = 'http://app.mydomain.com'

这与您的情况并不完全相同,但这可能会帮助一些人:

对于我当前的项目,我正在使用许多子域。测试套件还必须在不同的端口上运行

解决方案取决于您运行的是哪个版本的水豚

对于当前的最新版本,我将其放在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
对于capybara 1.1.2,我不得不进行上述更改,但
server\u host
变为
app\u host
,并在gem中修改lib/capybara/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

当需要更改URL以包含子域时,可以在步骤定义中指定
app\u主机
。使用类似于
lvh.me
的域,因为它指向
127.0.0.1

Capybara.app_host = "http://#{subdomain}.lvh.me"
Capybara假设当您指定
app\u host
时,您正在测试在端口80上运行的远程服务器,但在我们的示例中,我们正在测试在Capybara指定的随机端口上运行的本地应用。要解决此问题,请在
env.rb
文件中添加以下行:

Capybara.always_include_port = true
现在,当您访问应用程序的某个页面时

visit '/page'
…url将指定子域以及运行应用程序的端口

仅供参考:这对我使用Capybara 2.0.2有效。

截至:

  • 水豚(2.4.1)
  • 水豚网络工具包(1.3.0)


有趣。。。有机会的时候我会看看这个。谢谢!看来app_host是赢家,我希望文档能更清楚地说明区别,谢谢!这很好用。此外,如果您使用的是诸如
lvh.me
之类的公共域,则可以使用
Capybara.server\u port=31234
自动设置端口,然后
set\u host“lvh.me:31234”
默认主机对于(:each)之后的类似内容非常有用do Capybara.app\u host=Capybara.default\u host end
我可以工作,但当我有:访问新会话\u路径/url时,我得到了错误页面,该域是示例,应该用于测试:/也许对某人有帮助这个方法对我也有效,其他方法都不起作用。我在水豚2.4.3上。对于我的应用程序,我还想知道Capybara从测试环境中选择的端口号。我使用的是Poltergeist/PhantomJS,我可以从这个调用中获得信息:
Capybara.current_session.server.port
这似乎是个错误,因为Capybara的最新版本是2.13.0。@Sirasis yes 2.13将晚于2.4
Capybara.server_host = "example.com"
Capybara.server_port = 3050
Capybara.run_server = true
Capybara.javascript_driver = :webkit #requires capybara-webkit