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

运行RSpec测试时遇FrozenError:无法修改冻结数组求助

解决Rails RSpec测试中的FrozenError问题

问题描述

运行spec/requests目录下的RSpec测试时触发FrozenError,错误信息如下:

Failure/Error: require_relative '../config/environment'

FrozenError:
  can't modify frozen Array: ["/usr/local/lib/ruby/gems/3.2.0/gems/hotwire-livereload-1.3.1/app/channels", "/usr/local/lib/ruby/gems/3.2.0/gems/hotwire-livereload-1.3.1/app/helpers", "/usr/local/lib/ruby/gems/3.2.0/gems/turbo-rails-1.5.0/app/channels", "/usr/local/lib/ruby/gems/3.2.0/gems/turbo-rails-1.5.0/app/controllers", "/usr/local/lib/ruby/gems/3.2.0/gems/turbo-rails-1.5.0/app/controllers/concerns", "/usr/local/lib/ruby/gems/3.2.0/gems/turbo-rails-1.5.0/app/helpers", "/usr/local/lib/ruby/gems/3.2.0/gems/turbo-rails-1.5.0/app/models", "/usr/local/lib/ruby/gems/3.2.0/gems/turbo-rails-1.5.0/app/models/concerns", "/usr/local/lib/ruby/gems/3.2.0/gems/turbo-rails-1.5.0/app/jobs", "/usr/local/lib/ruby/gems/3.2.0/gems/importmap-rails-2.0.1/app/helpers", "/usr/local/lib/ruby/gems/3.2.0/gems/actiontext-7.1.3/app/helpers", "/usr/local/lib/ruby/gems/3.2.0/gems/actiontext-7.1.3/app/models"]
# ./config/environment.rb:5:in `<top (required)>'
# ./spec/rails_helper.rb:17:in `require_relative'
# ./spec/rails_helper.rb:17:in `<top (required)>'
# ./spec/requests/teams_spec.rb:1:in `<top (required)>'
No examples found.

相关配置文件

Rails_helper.rb

require 'simplecov'

SimpleCov.start do
  add_filter "/helpers"
  add_filter "/config"
  add_filter "/spec"

  add_group "Controllers", "app/controllers"
  add_group "Models", "app/models"
end

require 'spec_helper'

ENV['RAILS_ENV'] ||= 'test'

require_relative '../config/environment'

# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?

require 'rspec/rails'
require 'support/factory_bot'

# Checks for pending migrations and applies them before tests are run.
begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  abort(e.to_s.strip)
end

RSpec.configure do |config|
  config.fixture_path = "#{Rails.root}/spec/fixtures"

  # Devise Testing
  config.include(Devise::Test::IntegrationHelpers, type: :request)

  config.use_transactional_fixtures = true

  config.infer_spec_type_from_file_location!

  config.filter_rails_from_backtrace!

  # Faker configs
  Faker::Config.locale = :en
end

Environment.rb

require_relative "application"

# Initialize the Rails application.
Rails.application.initialize!

解决方案

  • 调整SimpleCov加载顺序
    把SimpleCov.start移到require_relative '../config/environment'之后。SimpleCov会修改$LOAD_PATH,而Rails初始化后部分数组会被冻结,提前加载会触发冲突。修改后的rails_helper.rb开头部分:

    require 'spec_helper'
    
    ENV['RAILS_ENV'] ||= 'test'
    
    require_relative '../config/environment'
    
    # 移到环境加载之后初始化SimpleCov
    require 'simplecov'
    SimpleCov.start do
      add_filter "/helpers"
      add_filter "/config"
      add_filter "/spec"
    
      add_group "Controllers", "app/controllers"
      add_group "Models", "app/models"
    end
    
  • 检查gem版本兼容性
    当前使用的hotwire-livereload 1.3.1、turbo-rails 1.5.0与Rails 7.1.3可能存在兼容性问题。可尝试:

    1. 升级hotwire-livereload到最新稳定版
    2. 暂时在test环境中移除hotwire-livereload,修改Gemfile:
      gem 'hotwire-livereload', group: [:development]
      
      执行bundle install生效。
  • 重置冻结的LOAD_PATH
    若上述方法无效,可在environment.rb中重新赋值$LOAD_PATH为可修改数组:

    require_relative "application"
    
    # 重置LOAD_PATH为非冻结数组
    $LOAD_PATH = $LOAD_PATH.dup
    
    # Initialize the Rails application.
    Rails.application.initialize!
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:02:04