web-dev-qa-db-fra.com

Pourquoi suis-je invité à exécuter 'rake db: migrate Rails_ENV = test'?

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?

55
Peeja

À 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.

67
Peeja

Ressemble à rake test:prepare fonctionne, pas sûr de quoi db:test:prepare fait maintenant.

29
Kris

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.

  1. ajouter ActiveRecord::Migration.maintain_test_schema! en haut du fichier test_helper.rb.
  2. rake test:prepare
  3. rake db:migrate
  4. 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.

10
SilasOtoko

Vous pouvez aussi essayer

rake db:migrate Rails_ENV=test

qui fonctionne comme

db:test:prepare

est-ce que:)

9
meejoe

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.

2
Jesse Brown

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
0
Unkas