ruby-on-rails - 带有子域的 capybara - default_host

标签 ruby-on-rails integration-testing capybara

我有一个使用子域来切换数据库( 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.xrspec-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/

相关文章:

selenium - 功能规范仅在 CircleCI 或 Codeship 持续集成服务上失败

ruby-on-rails - 使用 valid 时跳过特定验证?在事件记录中

java - 我应该如何在每次测试前重置 JPA 控制的数据库?

java - 如何将 Embedded PostgreSQL Server Java 组件用作单独的服务?

android - 我真的可以在测试中启用和禁用网络访问吗?

rspec - Capybara:如何使用 Capybara 测试表是否有 3 行?

ruby-on-rails - rails 3.1 : alias/images to/assets directory

ruby-on-rails - 没有这样的列 :bookmarks in the following many-to-many association

javascript - Rails form_tag 与嵌套资源嵌套

ruby-on-rails - 之前(:each) for all tests except one