具有子域的Capybara - default_host

bra*_*rad 47 integration-testing ruby-on-rails capybara

我有一个使用子域来切换数据库的应用程序(多租户).我正在尝试使用Capybara进行集成测试,它确实依赖于子域.

我的理解是,设置Capybara.default_host=某些内容会使我的所有请求都来自此主机.似乎并非如此.在这篇文章中,作者建议只使用主机访问显式网址,但如果我在整个地方导航,这会变得有点烦人.我想设置主机,然后能够按预期使用我的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
Run Code Online (Sandbox Code Playgroud)

这产生了输出:

Capybara.default_host: http://app.mydomain.com
some_app_url: http://www.example.com/some_path
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么? default_host似乎什么都不做.正如我所说,我不想说visit(Capybara.default_host + some_app_path),因为每次都有点烦人.为什么还存在default_host选项?

Lac*_*ter 59

我不确定它的用途default_host,但是app_host你需要什么.我发现我首先需要调用rails会话方法host!,以便设置将传递给请求对象中的控制器的主机字符串.

然后你需要设置Capybara.app_host告诉Capybara通过Web服务器调用你的应用程序,而不是只是正在进行调用.如果你不这样做,那么Capybara会在遇到重定向时退出并在第二个请求中删除主机信息.

我不确定为什么这不会request自动处理Rails的结尾,但我发现除非我明确地在两个地方设置主机,否则我会得到不一致的结果.

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

before(:each) do
  set_host "lvh.me:3000"
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用相对路径来访问页面.

更新:

Capybara 2.xrspec-rails 2.12.0引入了运行Capybara验收测试的"功能"规范.新FeatureExampleGroup模块与机架测试方法rspec-rails不同,RequestExampleGroup不再可以访问机架测试host!方法.现在你要使用default_url_options:

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

  • 这非常有效.此外,如果你使用像`lvh.me`这样的公共域,你可以使用`Capybara.server_port = 31234`自​​动设置端口,然后使用`set_host"lvh.me:31234" (4认同)

And*_*rew 32

如果需要更改URL以包含子域,可以app_host在步骤定义中指定.使用域名,lvh.me因为它指向127.0.0.1:

Capybara.app_host = "http://#{subdomain}.lvh.me"
Run Code Online (Sandbox Code Playgroud)

Capybara假设当你指定的app_host是你正在测试在端口80上运行的远程服务器时,但在我们的例子中,我们正在测试一个在Capybara指定的随机端口上运行的本地应用程序.要解决此问题,请在您的env.rb文件中添加以下行:

Capybara.always_include_port = true
Run Code Online (Sandbox Code Playgroud)

现在,当您访问应用的页面时......

visit '/page'
Run Code Online (Sandbox Code Playgroud)

... url将指定子域以及运行该应用程序的端口.

仅供参考:这对我来说使用Capybara 2.0.2.

  • 这个方法也适用于我,其他方法都不起作用.我在Capybara 2.4.3.对于我的应用程序,我还想知道Capybara从我的测试环境中选择的端口号.我正在使用Poltergeist/PhantomJS,我可以通过这个调用得到这些信息:```Capybara.current_session.server.port``` (3认同)

Jac*_*cob 5

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

http://zurb.com/forrst/posts/Testing_Subdomains_in_Capybara-g4M

你想做

Capybara.current_session.driver.reset!
Capybara.default_host = 'http://app.mydomain.com'
Run Code Online (Sandbox Code Playgroud)