RuntimeError:在rails 5.1中运行rspec时无法修改冻结的数组

jez*_*nag 15 ruby rspec ruby-on-rails

我最近从v4.3升级到Rails 5.1,现在运行测试时出现此错误:

An error occurred while loading 

./spec/controllers/admin/capacity_charges_controller_spec.rb.
Failure/Error: require File.expand_path('../../config/environment', __FILE__)

RuntimeError:
  can't modify frozen Array
Run Code Online (Sandbox Code Playgroud)

我得到每个测试文件.触发错误的行来自rails_helper.我检查了rails 5.1样品回购,我们的版本没有什么大不相同.

完整的堆栈跟踪是:

RuntimeError:


can't modify frozen Array
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/actionpack-5.1.0/lib/action_dispatch/middleware/stack.rb:74:in `insert'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/actionpack-5.1.0/lib/action_dispatch/middleware/stack.rb:74:in `insert'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/actionpack-5.1.0/lib/action_dispatch/middleware/stack.rb:81:in `insert_after'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/request_store-1.3.2/lib/request_store/railtie.rb:5:in `block in <class:Railtie>'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:30:in `instance_exec'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:30:in `run'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:59:in `block in run_initializers'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:58:in `run_initializers'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/railties-5.1.0/lib/rails/application.rb:353:in `initialize!'
# ./config/environment.rb:5:in `<top (required)>'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `require'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `block in require'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:258:in `load_dependency'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `require'
# ./spec/rails_helper.rb:12:in `<top (required)>'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `require'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `block in require'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:258:in `load_dependency'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `require'
# ./spec/controllers/admin/capacity_charges_controller_spec.rb:3:in `<top (required)>'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:286:in `load'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:286:in `block in load'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:258:in `load_dependency'
# /Users/jeremynagel/.rvm/gems/ruby-2.3.1@Rails4.2_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:286:in `load'
Run Code Online (Sandbox Code Playgroud)

jez*_*nag 18

事实证明这是由堆栈跟踪中更高的测试失败引起的.很难看出根本原因是什么,因为控制台中有这么多.如果你遇到这个问题,我建议使用--fail-fast,这样你就不会被重复的错误消息所淹没.然后检查第一个错误是什么.

  • 在我的情况下pg连接:) (3认同)
  • 我的factory_bot规范中有一个重复的工厂生成器名称,这导致了这个 (3认同)
  • 这是发现问题 `rspec --fail-fast | 的替代方法 头` (2认同)

Dor*_*ian 10

我确实rspec | less找到了第一个错误


sch*_*jos 8

对我来说,这是一个FactoryBot更新从版本45。我没有看到弃用警告,因为我跳过了版本:

DEPRECATION WARNING: Static attributes will be removed in FactoryBot 5.0.
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有用,在 /spec/factories 中将 `last_name "Lincoln"` 更改为 `last_name { "Lincoln" }` 解决了冻结数组错误 (2认同)

小智 8

首先检查您的测试数据库是否是最新的。

耙数据库:测试:准备。


Dan*_*n L 5

有时,如果 Ruby 类中的类名继承错误,也会引发此异常。请记住,控制器、模型等在 Ruby 中都是常量。

这是我遇到的情况中的一个例子。实际的语法可能不正确,但这是导致我的问题的概念。

module Admin
  class BaseController < ::ApplicationController
    ...
  end
end

# throws error, referencing constant that does not exist.
# Should be < ::Admin::BaseController
class OtherController < ::BaseController
end
Run Code Online (Sandbox Code Playgroud)

和其他人一样,我的整个rspec套件都会因错误而失败can't modify a frozen Array,在这种情况下,这本身并不是一个非常有用的堆栈跟踪。

希望这可以让其他人免于花几个小时寻找其他东西!