J'ai récemment mis à niveau vers Rails 5.1 depuis la v4.3 et j'obtiens maintenant cette erreur lors de l'exécution des tests:
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
Je l'obtiens pour chaque fichier de test. La ligne qui déclenche l'erreur provient de Rails_helper. J'ai vérifié Rails 5.1 exemples de dépôts et il n'y a rien de substantiellement différent dans notre version.
La trace de pile complète est:
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'
Il s'avère que cela a été causé par des échecs de test plus élevés dans la trace de la pile. Il était difficile de voir quelle était la cause principale car il y avait tellement de choses dans la console. Si vous rencontrez ce problème, je vous suggère d'utiliser --fail-fast pour ne pas être submergé de messages d'erreur récurrents. Vérifiez ensuite quelle est la première erreur.
Pour moi, c'était une mise à jour FactoryBot de la version 4
à 5
. Je n'ai pas vu l'avertissement de dépréciation parce que j'ai sauté des versions:
DEPRECATION WARNING: Static attributes will be removed in FactoryBot 5.0.
Lorsque j'ai eu la même erreur avec un stacktrace similaire, cela m'a aidé à corriger une erreur de syntaxe dans les usines.
Parfois, cette exception est également déclenchée si vous avez un mauvais héritage de nom de classe dans vos classes Ruby. N'oubliez pas que les contrôleurs, les modèles, etc., sont tous des constantes dans Ruby.
Ceci est un exemple du haut de ma tête d'une situation que j'ai rencontrée. La syntaxe réelle peut être désactivée, mais c'est le concept qui a causé mon problème.
module Admin
class BaseController < ::ApplicationController
...
end
end
# throws error, referencing constant that does not exist.
# Should be < ::Admin::BaseController
class OtherController < ::BaseController
end
Comme les autres, toute ma suite rspec
échouerait avec l'erreur can't modify a frozen Array
, qui n'est pas une trace de pile très utile dans ce cas, en soi.
J'espère que cela sauvera quelqu'un d'autre de passer des heures à traquer tout le reste!
Dans le cas où cela aiderait quelqu'un à l'avenir, c'était un problème de connexion à la base de données (Postgresql dans mon cas). Rendez-vous sur config/database.yml
fichier et fourniture username:
et password:
<la valeur par défaut est toor>
Ajoutez ceci dans le development:
groupe.
Dans mon cas, Rails_admin récent a nécessité quelques ajouts
RuntimeError: les middlewares requis pour RailsAdmin ne sont pas ajoutés
Pour corriger ces problèmes, ajoutezconfig.middleware.use ActionDispatch::Flash
à config/application.rb.
Ensuite, toutes les rspecs sont redevenues vertes.
Dans mon cas, cela était dû à un message de conflit git (celui comme >>>> ... === ... <<<<
) Que j'ai manqué de résoudre, il y a donc eu une erreur de syntaxe lorsque Rspec a essayé de charger cette classe.
L'option de ligne de commande --fail-fast
N'aide pas dans ce cas car l'erreur se produit plus haut dans la pile des appels, mais vous pouvez voir l'erreur réelle en exécutant simplement n'importe quel fichier de spécification.
J'ai essayé de mettre à jour de Rails 3 à Rails 5. Je viens de définir config.eager_load
option et cela a aidé. Soit vers false
ou true
. Pas nil
, s'il vous plaît