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
相关产品推荐
相关产品推荐

