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交互的,按照以下步骤调整:
- 先确认视图中该按钮/链接是否添加了AJAX标识:
- Rails 6及以下版本:确保有
remote: true参数 - Rails 7及以上Turbo环境:确保有
data-turbo-stream="true"参数
- Rails 6及以下版本:确保有
- 给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
相关产品推荐
相关产品推荐

