为何Capybara调用visit访问root_path时未向浏览器传递服务端端口
问题根因
你遇到的端口缺失问题核心有两个:
- Rails 6 系统测试默认会自动将
Capybara.app_host覆盖为不带端口的http://127.0.0.1,当你手动指定了不带端口的主机地址时(不管是通过全局app_host还是host!方法),Capybara.always_include_port配置不会生效,该配置仅在未自定义主机地址、调用visit使用相对路径时才会自动追加端口。 - 你之前注释的静态
CAPYBARA_APP_HOST定义时机过早,此时Capybara测试服务还未启动,动态端口尚未分配,就算打开注释也拿不到正确的运行时端口。
解决方案
不需要固定服务端口,也不需要手动启动Rails服务,仅修改rails_helper.rb中RSpec的系统测试前置逻辑即可:
保留原有配置不动,仅修改config.prepend_before(:each, type: :system)块内容如下:
config.prepend_before(:each, type: :system) do # 运行时动态获取Capybara自动分配的服务地址,直接拼接端口 Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}" # 如果你习惯用host!方法,也可以替换为下面这行 # host! "http://#{Capybara.server_host}:#{Capybara.server_port}" driven_by Capybara.javascript_driver end
验证
修改后直接执行 bundle exec rspec,Capybara会自动启动测试服务,浏览器访问的地址会自动携带分配的端口,HEADLESS开关也可以正常控制是否展示执行过程,无需手动启动Rails服务。
如果修改后仍有问题,检查system/support目录下的自定义配置是否存在覆盖app_host或host的逻辑,删除相关配置即可。
内容的提问来源于stack exchange,提问作者Shalaby
相关产品推荐
相关产品推荐

