我最近从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
答案 0 :(得分:14)
原来这是由堆栈跟踪中较高的测试失败引起的。很难看出根本原因是什么,因为控制台中有这么多。如果你遇到这个问题,我建议使用--fail-fast,这样你就不会被重复的错误消息所淹没。然后检查第一个错误是什么。
答案 1 :(得分:2)
对我来说,这是从版本4
到5
的 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
选项,它有所帮助。 false
或true
中的一个。请不要nil
答案 15 :(得分:-1)
首先检查您的测试数据库是否最新。
rake db:test:prepare。
答案 16 :(得分:-2)
尝试在背景上运行redis和sidekiq。就我而言,这是原因之一。