我有一个使用子域来切换数据库( Multi-Tenancy )的应用程序。我正在尝试使用 Capybara 进行集成测试,它确实非常依赖于子域。
我的理解是,将Capybara.default_host=
设置为某项将使我的所有请求都来自该主机。事实似乎并非如此。在 this post ,作者建议仅通过主机访问显式 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
我做错了什么? default_host
似乎什么也没做。正如我所说,我不想说 visit(Capybara.default_host + some_app_path)
因为每次都有点烦人。为什么还要存在这个 default_host 选项?
最佳答案
我不确定 default_host
的预期用途,但 app_host
可以满足您的需要。我发现我首先需要调用 Rails session 方法 host!
以便设置将传递给请求对象中的 Controller 的主机字符串。
然后,您需要设置 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 验收测试的“功能”规范。 rspec-rails
中的新 FeatureExampleGroup
模块与 RequestExampleGroup
不同,并且不再有权访问机架测试主机!
方法。现在您想使用 default_url_options
来代替:
def set_host (host)
# host! host
default_url_options[:host] = host
Capybara.app_host = "http://" + host
end
关于ruby-on-rails - 带有子域的 capybara - default_host,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6536503/