You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Capybara & RSPEC测试触发ActionController::UnknownFormat错误如何修复?

ActionController::UnknownFormat 报错修复方案

错误原因

控制器new动作仅配置了对JS格式请求的响应,而Capybara测试中点击「Add New Location」按钮时发送的是HTML格式请求,控制器找不到匹配的响应格式就抛出该错误。你之前取消注释format.html无效,大概率是因为没有对应new.html.erb模板,或是该按钮本身设计为触发AJAX请求,普通HTML请求不符合业务逻辑。

修复方案

方案1:适配按钮的AJAX设计(推荐,符合原有代码逻辑)

你的「Add New Location」按钮明显是用来触发前端JS交互的,按照以下步骤调整:

  1. 先确认视图中该按钮/链接是否添加了AJAX标识:
    • Rails 6及以下版本:确保有remote: true参数
    • Rails 7及以上Turbo环境:确保有data-turbo-stream="true"参数
  2. 给Capybara测试用例开启JS驱动支持,修改测试代码的用例声明,添加js: true标记:
describe "this tab" do
    it "shows data", js: true do 
      visit locations_profile_path(@provider)
      expect(current_path).to eq("/profile/#{@provider.id}/locations")
      expect(page).to have_content("All Practice Locations")
      expect(page).to have_content('Add New Location')
      Capybara.default_max_wait_time = 20
      click_on 'Add New Location'
    end
end

默认的Capybara :rack_test驱动不支持JS,会直接发送普通HTML请求,添加js: true后会调用Selenium、Cuprite等支持JS的驱动,正确触发AJAX的JS格式请求。

方案2:同时支持HTML和JS两种响应格式

如果确实需要兼容普通HTML请求,修改控制器代码,同时确保存在new.html.erb模板:

def new
  @location = @provider.locations.new
  @address = @location.build_address
  @addresses = []
  respond_to do |format|
    format.html
    format.js
  end
end

方案3:强制控制器响应JS格式

如果不管请求是什么格式都要返回JS响应,可以直接强制指定请求格式:

def new
  request.format = :js
  @location = @provider.locations.new
  @address = @location.build_address
  @addresses = []
  respond_to do |format|
    format.js
  end
end

排查辅助

如果以上方案都无效,可以查看Rails测试环境的日志,确认点击按钮时请求的format参数和Accept请求头,定位格式不匹配的具体原因。

内容的提问来源于stack exchange,提问作者Moeeee100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:15:01