我有一个使用子域来切换数据库的应用程序(多租户)。我正在尝试使用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选项?
答案 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-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