我有一个应用程序,使用子域切换数据库(多租户).我正在try 使用水豚进行集成测试,它实际上非常依赖子域.

我的理解是,将Capybara.default_host=设置为某个值会使我所有的请求都来自这个主机.事实似乎并非如此.在this post中,作者建议只使用主机访问显式url,但如果我到处浏览,这会变得有点烦人.我只想设置主机,然后按照预期使用rails路径.不确定我做错了什么,但以下是我try 过的:

# 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的预期用途,但app_host可以满足你的需要.我发现我首先需要调用rails会话方法host!,以便设置将传递给请求对象中的控制器的主机字符串.

然后你需要设置Capybara.app_host,让水豚通过网络服务器调用你的应用程序,而不仅仅是在过程中进行调用.如果您不这样做,那么当水豚遇到重定向并在第二个请求中删除主机信息时,它就会跳转.

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

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

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

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

Update:

Capybara 2.xrspec-rails 2.12.0引入了运行水豚验收测试的"功能"规范.rspec-rails中的新FeatureExampleGroup模块与RequestExampleGroup不同,不再使用Rack 测试host!方法.现在你想用default_url_options来代替:

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

Ruby-on-rails相关问答推荐

这种使用on:的语法在 Ruby on Rails 中意味着什么?

将日期时间转换为月、日和年?

Ruby/Rails 中的类方法与常量

如果 URL 不存在,请将 http(s) 添加到 URL?

FactoryGirl + Faker - 为数据库种子数据中的每个对象生成相同的数据

从子类中的重载方法调用基类方法

使用 ActiveRecord 3 / Arel 查找单个记录的最佳方法?

HABTM 关系 - 如何根据关联模型的属性找到记录

从 before_action 中排除控制器

Rails 服务对象与 lib 类

如何将自定义路由添加到资源路由

在rails中带有内部文本或html的link_to image_tag

从 ActiveRecord 对象中提取两个属性的快捷方式?

将 Rails 服务器绑定到 0.0.0.0 能给你带来什么?

如何翻译 ActiveRecord 模型类名称?

# 轨道中的 TODO

即使X-Frame-Options为ALLOWALL,也无法在 iframe 中显示我的 rails 4 应用程序

Rails: Sprockets::Rails::Helper::AssetNotPrecompiled 在开发中

ActiveRecord 何时会保存关联?

Rails 路由 (root :to => ...)