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

时间:2017-11-16 02:52:17

标签: ruby-on-rails ruby rspec

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

@Scheduled(cron = "0 0 0 * * *",zone = "Indian/Maldives")

我为每个测试文件都得到它。触发错误的行来自rails_helper。我已检查过导轨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

17 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

以防万一将来对任何人有帮助,这是数据库连接问题(在我的情况下是Postgresql)。转到config/database.yml文件并提供username:password: <默认为 or >

将其添加到development:组中。

答案 3 :(得分:1)

我认为当我遇到类似问题时,是由于语法错误。尝试运行 rails db:migrate 以显示有关发生错误的行的更多信息

答案 4 :(得分:1)

Sometimes this exception is also raised if you have a wrong class name inheritance in your Ruby classes. Remember that controllers, models, etc, are all constants in Ruby.

This is an example off the top-of-my-head of a situation I encountered. Actual syntax may be off, but this was the concept that caused my problem.

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

# throws error, referencing constant that does not exist.
# Should be < ::Admin::BaseController
class OtherController < ::BaseController
end

Like others, my entire rspec suite would fail with the error can't modify a frozen Array, which isn't a very helpful stacktrace in this instance, per se.

Hope this save someone else from spending hours hunting down everything else!

答案 5 :(得分:0)

我在使用 Rails 6 处理应用程序时遇到了同样的问题。

问题是,当我运行命令 rspec 时,出现以下错误。下面的输出被缩短:

An error occurred while loading ./spec/routing/applyportal/school_histories_routing_spec.rb.
Failure/Error: require File.expand_path('../config/environment', __dir__)

FrozenError:
  can't modify frozen Array: ["/home/promisechukwuenyem/Projects/myapp/app/channels", 

我是这样解决的

问题是我执行 git pull 后代码中的错误造成的。

自从我在开发中运行以来,我尝试使用以下方法删除我的数据库:

rails db:drop

注意:这并没有删除我的数据库,因为命令被我的代码中的错误中断了。

然后是我的终端中出现错误的实际位置,即我的 config/route.rb 文件。

我打开了我的 config/route.rb 文件。然后我发现了这个:

# frozen_string_literal: true

Rails.application.routes.draw do
<<<<<<< HEAD
  resources :courses
=======
  resources :results
>>>>>>> Added result and result upload feature
  resources :books
  resources :schools
end

然后修改成这样:

# frozen_string_literal: true

Rails.application.routes.draw do
  resources :books
  resources :results
  resources :schools
end

仅此而已。

我希望这会有所帮助

答案 6 :(得分:0)

那是因为我忘记将 bullet 添加到 test 中的 Gemfile 组中,查看我看到的错误顶部:

NameError:
  uninitialized constant Bullet

答案 7 :(得分:0)

建议:在您的development.rb文件中添加config.eager_load = true后,尝试在开发中加载应用程序,这将为您提供指出错误代码的实际有用的错误消息。

在我的情况下,是一个Rails 5.2应用程序,它纯粹是从Ruby 2.4.5升级到2.5.8的结果,它指出唯一的问题是unmatched range specifier in char-class在一个已经使用了多年的很长的正则表达式中

答案 8 :(得分:0)

尝试在环境文件中设置config.eager_load = true。这样会在引导过程中将所有文件加载到内存中,并且会首先指出现有的语法错误(如果有的话)。

答案 9 :(得分:0)

我将发布原因,但首先,我将发布故障排除路径以帮助查找您的原因,因为此错误可能会出现很多原因。

在大多数情况下,这是一个相当无用的错误,并且堆栈跟踪是不可穿透的。我检查了堆栈中的所有gem代码,但都没有指出问题的实际来源:

# /Users/dh/.gem/gems/actionpack-5.2.3/lib/action_dispatch/middleware/stack.rb:76:in `insert'
# /Users/dh/.gem/gems/actionpack-5.2.3/lib/action_dispatch/middleware/stack.rb:76:in `insert'
# /Users/dh/.gem/gems/actionpack-5.2.3/lib/action_dispatch/middleware/stack.rb:83:in `insert_after'
# /Users/dh/.gem/gems/request_store-1.4.1/lib/request_store/railtie.rb:5:in `block in <class:Railtie>'
# /Users/dh/.gem/gems/railties-5.2.3/lib/rails/initializable.rb:32:in `instance_exec'
# /Users/dh/.gem/gems/railties-5.2.3/lib/rails/initializable.rb:32:in `run'
# /Users/dh/.gem/gems/railties-5.2.3/lib/rails/initializable.rb:61:in `block in run_initializers'
# /Users/dh/.gem/gems/railties-5.2.3/lib/rails/initializable.rb:60:in `run_initializers'
# /Users/dh/.gem/gems/railties-5.2.3/lib/rails/application.rb:361:in `initialize!'
# ./config/environment.rb:5:in `<top (required)>'

要查明为什么会出现此错误,请首先注释掉(或改回)上一次执行的操作,然后查看问题是否消失。如果不是,请还原该行代码,然后git stash隐藏 all 您最近的更改并运行测试。

这可能会解决问题,您可以git stash pop并开始将更改分成两半,直到确定问题出在哪里。

如果git stash不能解决问题,则说明问题出在代码外部,或者在上一次提交中存在。

如果您知道以前的提交经过了干净的测试,请开始查看数据库,捆绑gem,更改所使用的ENV变量或应用程序依赖的其他环境因素。

如果git stash 不能解决了该问题,并且您不知道上次提交之前是否经过了干净测试,请开始手动或使用{{ 1}}。如果您可以找到一个开始破坏测试的提交,则可以跟踪触发此错误的行。

-

对于我的特定问题,这是我添加的新git bisect关系中的错字:

has_many

一旦我将更改范围缩小到那一行,解决方法就显而易见了:

  has_many :marijunas, class_name: Drug

答案 10 :(得分:0)

我的两分钱,可能会帮助别人。当将rails 4.2升级到5.0时,我遇到了同样的问题,我在某处看到一个线程发布,建议一次/一次运行一次规格测试。当我这样做时,我遇到了另一个错误:superclass must be a Class并指向我的新.../models/application_record.rb文件,在其中我由于遗漏而导致语法错误:

class ApplicationRecord < ActiveRecord                              
  self.abstract_class = true
end

在第一行::Base之后,缺少以上内容ActiveRecord

class ApplicationRecord < ActiveRecord::Base                                
  self.abstract_class = true
end

将其重新添加到我的所有规格中。

答案 11 :(得分:0)

当我使用类似的stacktrace遇到相同的错误时,它帮助我修复了工厂中的语法错误。

答案 12 :(得分:0)

在我的情况下,这是由于我错过了解决一个git冲突消息(类似deleteSetting() { this.settingsService.deleteSetting(this.keyNameToDelete); this.update.next(true); } 的消息),所以Rspec尝试加载该类时出现语法错误。

>>>> ... === ... <<<<命令行选项在这种情况下无济于事,因为错误在调用堆栈中的发生率更高,但是您可以通过运行任何单个spec文件来查看实际错误。

答案 13 :(得分:0)

就我而言,最近的rails_admin需要添加一些内容

  

RuntimeError:未添加RailsAdmin所需的中间件
  要修复此问题,请添加

config.middleware.use ActionDispatch::Flash
     

配置/application.rb。

然后所有rspec再次变为绿色。

答案 14 :(得分:0)

我试图从Rails 3更新到Rails 5。 我只是设置了config.eager_load选项,它有所帮助。 falsetrue中的一个。请不要nil

答案 15 :(得分:-1)

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

rake db:test:prepare。

答案 16 :(得分:-2)

尝试在背景上运行redis和sidekiq。就我而言,这是原因之一。