具有子域的Capybara - default_host

时间:2011-06-30 14:39:19

标签: ruby-on-rails integration-testing capybara

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

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

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

5 个答案:

答案 0 :(得分:58)

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

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

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

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

before(:each) do
  set_host "lvh.me:3000"
end

然后你可以使用相对路径来访问页面。

<强>更新

Capybara 2.x rspec-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

答案 1 :(得分:31)

如果您需要更改网址以包含子域,则可以在步骤定义中指定app_host。使用lvh.me之类的域名,因为它指向127.0.0.1

Capybara.app_host = "http://#{subdomain}.lvh.me"

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

Capybara.always_include_port = true

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

visit '/page'

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

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

答案 2 :(得分:5)

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

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

你想做

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

答案 3 :(得分:1)

截至:

  • capybara(2.4.1)
  • capybara-webkit(1.3.0)

    Capybara.server_host = "example.com"
    Capybara.server_port = 3050
    Capybara.run_server = true
    Capybara.javascript_driver = :webkit #requires capybara-webkit
    

答案 4 :(得分:0)

这与你的情况并不完全相同,但这可能对某些人有所帮助:

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

解决方案取决于您正在运行的水豚版本。

对于当前的最新版本,我将其放在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_host变为app_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