运行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可能存在兼容性问题。可尝试:- 升级hotwire-livereload到最新稳定版
- 暂时在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
相关产品推荐
相关产品推荐

