On Rails 4.0.0.rc1, Ruby 2.0.0, après avoir effectué une migration, je vois l'erreur suivante lorsque j'essaie de lancer un test rspec
:
/Users/peeja/.rbenv/versions/2.0.0-p0/lib/Ruby/gems/2.0.0/gems/activerecord-4.0.0.rc1/lib/active_record/migration.rb:376:in `check_pending! ': Les migrations sont en attente; lancez 'rake db: migrate Rails_ENV = test' pour résoudre ce problème. (ActiveRecord :: PendingMigrationError)
Cela ne semble pas juste. Personne ne migre leur base de test, n'est-ce pas? Ils db:test:prepare
Le, ce que - pour être juste - j'ai oublié de faire. Donc, je lance rake db:test:prepare
Et relance ma commande rspec
… et je vois la même erreur.
Si j'ai réellement rake db:migrate Rails_ENV=test
, L'erreur disparaîtra en fait.
Que se passe-t-il? Est-ce nouveau dans Rails 4?
À partir de Rails 4.1, le rake db:test:*
les tâches sont obsolètes. Au lieu de cela, votre (test|spec)_helper.rb
devrait inclure:
ActiveRecord::Migration.maintain_test_schema!
Cela signifie que votre base de données de test obtiendra le schéma correct à chaque exécution de vos tests, que vous les exécutiez à partir d'une tâche Rake ou non.
Ressemble à rake test:prepare
fonctionne, pas sûr de quoi db:test:prepare
fait maintenant.
J'ai encore parfois du mal à régler ce problème quand je ne fais que suivre la réponse d'une personne, alors j'en ai jeté un couple pour obtenir de meilleurs résultats. Voici les étapes que je fais, sans savoir lesquelles sont inutiles, mais cela fonctionne à la fin.
ActiveRecord::Migration.maintain_test_schema!
en haut du fichier test_helper.rb.rake test:prepare
rake db:migrate
rake db:migrate Rails_ENV=test
Puis quand je cours bundle exec rake test
Je reçois des résultats clairs à chaque fois, sans migration en attente. (C'est ce que je fais juste après avoir généré l'échafaud la première fois). Quelqu'un se sent libre de me corriger si vous êtes certain qu'une de ces étapes n'est absolument pas nécessaire, mais c'est comme cela que je m'assure que cela fonctionne à chaque fois.
Vous pouvez aussi essayer
rake db:migrate Rails_ENV=test
qui fonctionne comme
db:test:prepare
est-ce que:)
J'ai constaté que je rencontrais ce problème lorsque j'utilisais chruby
pour gérer mes Ruby. Rails appelle bin/Rails db:test:prepare
via la commande système. Cela ne profite pas de chrubys $PATH
env var, le système fonctionne donc quel que soit le système Ruby est, et échoue généralement à cause du manque de gemmes. Malheureusement, je n’ai pas actuellement de bonne solution pour cela.
Vous pouvez essayer de définir la variable BEFORE, comme ceci. Cette déclaration a résolu mon problème:
Rails_ENV=test rake db:migrate