PAYATHON 2026

Rails 8.0.4 使用 Minitest 6 运行测试时报参数错误,如何修复?

数据小陈

结论

问题出在 Rails 8.0.4 的测试适配代码与 Minitest 6 的方法参数不兼容。line_filtering.rb 中的 Rails 代码仍按旧签名调用 run,而 Minitest 6 调整了该方法的参数,因此测试启动时会出现 ArgumentError。新建项目也可能遇到这个问题:如果 Gemfile 没有限制 Minitest 的版本,依赖解析可能会安装 Minitest 6。

Rails 8.0.5 的提交记录中包含对 Minitest 6 的兼容修复。可以升级到包含该修复的 Rails 版本;如果暂时无法升级,则先将 Minitest 固定在 5.x。(Rails 8.0.5 发布说明,Rails 8.0.5 提交记录)

方案一:将 Minitest 固定在 5.x

在 Gemfile 中添加版本约束:

gem "minitest", "~> 5.25"

然后更新依赖,并检查 Bundler 实际解析出的版本:

bundle update minitest
bundle exec ruby -e 'require "minitest"; puts Minitest::VERSION'
bin/rails test

~> 5.25 会将版本限制在 Minitest 5.x。修改 Gemfile 后,检查命令的输出是否以 5. 开头。如果仍以 6. 开头,当前运行命令所用的依赖环境可能没有应用这项锁定。请检查运行目录、Bundler 环境,以及 Gemfile.lock 中记录的 Minitest 版本。

方案二:升级 Rails

将 Rails 升级到包含 Minitest 6 兼容修复的版本,例如 Rails 8.0.5,然后重新解析依赖并运行测试:

bundle update rails
bin/rails test

如果 Gemfile 中的 Rails 版本约束不允许解析到目标版本,先调整该约束,再执行更新。升级后,可以运行 bundle exec ruby -e 'require "rails"; puts Rails.version' 确认实际使用的 Rails 版本。

为什么全新项目也会报错

没有修改 Gemfile,并不代表依赖版本已经固定。Gemfile.lock 记录了 Bundler 为项目解析出的具体版本;如果项目没有限制 Minitest 的主版本,安装依赖时就可能选中 Minitest 6。此时,Rails 8.0.4 的测试代码会遇到上述参数不匹配问题。可以查看锁文件并运行版本检查命令,确认项目实际解析出的依赖版本。

备注:内容仅供参考。