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

问题描述 投票:10回答:8

我最近从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

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

完整的堆栈跟踪是:

RuntimeError:


can't modify frozen Array
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/actionpack-5.1.0/lib/action_dispatch/middleware/stack.rb:74:in `insert'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/actionpack-5.1.0/lib/action_dispatch/middleware/stack.rb:74:in `insert'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/actionpack-5.1.0/lib/action_dispatch/middleware/stack.rb:81:in `insert_after'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/request_store-1.3.2/lib/request_store/railtie.rb:5:in `block in <class:Railtie>'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:30:in `instance_exec'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:30:in `run'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:59:in `block in run_initializers'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/railties-5.1.0/lib/rails/initializable.rb:58:in `run_initializers'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/railties-5.1.0/lib/rails/application.rb:353:in `initialize!'
# ./config/environment.rb:5:in `<top (required)>'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `require'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `block in require'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:258:in `load_dependency'
# /Users/jeremynagel/.rvm/gems/[email protected]_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/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `require'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:292:in `block in require'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:258:in `load_dependency'
# /Users/jeremynagel/.rvm/gems/[email protected]_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/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:286:in `load'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:286:in `block in load'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:258:in `load_dependency'
# /Users/jeremynagel/.rvm/gems/[email protected]_EnergyLink/gems/activesupport-5.1.0/lib/active_support/dependencies.rb:286:in `load'
ruby-on-rails ruby rspec
8个回答
15
投票

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


2
投票

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

DEPRECATION WARNING: Static attributes will be removed in FactoryBot 5.0.

1
投票

有时,如果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

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

希望这可以节省其他人花费数小时追捕其他一切!


1
投票

当我得到类似堆栈跟踪的相同错误时,它帮助我修复了工厂中的语法错误。


0
投票

我尝试从Rails 3更新到Rails 5.我只是设置config.eager_load选项,它有所帮助。要么是false,要么是true。请不要nil


0
投票

在我的情况下,最近的rails_admin需要一些补充

RuntimeError:未添加RailsAdmin所需的中间件 要解决这个问题,请添加

config.middleware.use ActionDispatch::Flash

to config / application.rb。

然后所有的rspec再次变绿了。


0
投票

在我的情况下,这是由于我错过了解决的git冲突消息(像>>>> ... === ... <<<<这样),所以当Rspec尝试加载该类时出现语法错误。

在这种情况下,--fail-fast命令行选项没有帮助,因为调用堆栈中的错误发生率更高,但您可以通过运行任何单个spec文件来查看实际错误。


-1
投票

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

rake db:test:prepare。

© www.soinside.com 2019 - 2024. All rights reserved.