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

Puma::Events类未定义strings方法的Capybara测试报错求助

问题:Capybara + Puma 6.x 系统测试触发 NoMethodError

测试场景与代码

正在运行依赖JavaScript的系统测试,验证页面索引加载及指定元素存在,测试代码如下:

class ProfitsTest < ApplicationSystemTestCase
  setup do
    @admin = users(:admin)
    @admin.confirm
    sign_in @admin
  end

  test 'visiting the index' do
    # Index only test
    visit profits_url
    assert_selector 'h1', text: '計算表'
  end
end

Capybara配置(用于去除Puma启动日志)

require 'test_helper'

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :headless_chrome # :chrome
  Capybara.server = :puma, { Silent: true }
  Selenium::WebDriver.logger.ignore(:browser_options)
end

报错信息

运行测试时触发如下错误:

#<Thread:0x000000010f82b2d8 /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/server.rb:76 run> terminated with exception (report_on_exception is true):
/Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/registrations/servers.rb:32:in `block in <main>': undefined method `strings' for Puma::Events:Class (NoMethodError)

  events = conf.options[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
                                                 ^^^^^^^^
    from /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/config.rb:64:in `block in server='
    from /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/server.rb:77:in `block in boot'
E

Error:
ProfitsTest#test_visiting_the_index:
NoMethodError: undefined method `strings' for Puma::Events:Class
    /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/registrations/servers.rb:32:in `block in <main>'
    /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/config.rb:64:in `block in server='
    /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/server.rb:77:in `block in boot'

Error:
ProfitsTest#test_visiting_the_index:
NoMethodError: undefined method `strings' for Puma::Events:Class
    /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/registrations/servers.rb:32:in `block in <main>'
    /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/config.rb:64:in `block in server='
    /Users/cody/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/capybara-3.37.1/lib/capybara/server.rb:77:in `block in boot'


rails test test/system/profits_test.rb:20

将Silent: true改为Silent: false时,会提示Puma::Events类未定义stdio方法。当前环境版本:Rails 6.1.7、Puma 6.0.0、Capybara 3.37.1。

解决方案

原因

Puma 6.x 重构了Puma::Events类,移除了旧版本中的strings和stdio类方法,而Capybara 3.37.1未适配这一变更,导致配置冲突报错。

解决办法

方法1:升级Capybara到兼容版本

将Capybara升级至3.39.0及以上版本,该版本开始适配Puma 6.x的Events接口变更,升级后原Silent: true配置可正常使用。

修改Gemfile:

gem 'capybara', '>= 3.39.0'

执行bundle update capybara完成升级。

方法2:手动配置Puma Events(无需升级Capybara)

若暂时无法升级Capybara,可替换Silent: true的配置方式,手动创建静默的Events实例:

require 'test_helper'

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :headless_chrome # :chrome
  
  Capybara.server = :puma, {
    before_boot: lambda { |app, conf|
      # 用空IO对象创建静默Events实例
      conf.events = Puma::Events.new(StringIO.new, StringIO.new)
    }
  }
  
  Selenium::WebDriver.logger.ignore(:browser_options)
end

此方式直接绕过Capybara旧的Puma配置逻辑,手动指定Puma使用静默日志输出,避免调用已被移除的类方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:56:30