2017-06-07 1 views
9

Après avoir créé un nouveau fichier de migration, la migration en cours d'exécution, puis en exécutant mes tests que je reçois:Pourquoi dois-je migrer la base de données de test dans Rails?

Failure/Error: ActiveRecord::Migration.maintain_test_schema! 

ActiveRecord::PendingMigrationError: 

    Migrations are pending. To resolve this issue, run: 

      bin/rails db:migrate RAILS_ENV=test 

est-ce pas l'extrait suivant dans le rails_helper.rb censé appliquer les migrations à la base de données de test pour moi?

# Checks for pending migration and applies them before tests are run. 
# If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.maintain_test_schema! 

Mise à jour

Voici mon config/environments/test.rb comme demandé:

Rails.application.configure do 
    # Settings specified here will take precedence over those in config/application.rb. 

    # The test environment is used exclusively to run your application's 
    # test suite. You never need to work with it otherwise. Remember that 
    # your test database is "scratch space" for the test suite and is wiped 
    # and recreated between test runs. Don't rely on the data there! 
    config.cache_classes = true 

    # Do not eager load code on boot. This avoids loading your whole application 
    # just for the purpose of running a single test. If you are using a tool that 
    # preloads Rails for running tests, you may have to set it to true. 
    config.eager_load = false 

    # Configure public file server for tests with Cache-Control for performance. 
    config.public_file_server.enabled = true 
    config.public_file_server.headers = { 
    'Cache-Control' => 'public, max-age=3600' 
    } 

    # Show full error reports and disable caching. 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 

    # Raise exceptions instead of rendering exception templates. 
    config.action_dispatch.show_exceptions = false 

    # Disable request forgery protection in test environment. 
    config.action_controller.allow_forgery_protection = false 
    config.action_mailer.perform_caching = false 

    # Tell Action Mailer not to deliver emails to the real world. 
    # The :test delivery method accumulates sent emails in the 
    # ActionMailer::Base.deliveries array. 
    config.action_mailer.delivery_method = :test 

    # Print deprecation notices to the stderr. 
    config.active_support.deprecation = :stderr 

    # Raises error for missing translations 
    # config.action_view.raise_on_missing_translations = true 
end 
+0

Y a-t-il des chances que vous utilisiez sqlite? – jvillian

+0

N'a même pas pensé à le mentionner, j'utilise réellement PostgreSQL. – ardavis

+0

Quelle est votre version de Rails? – Thanh

Répondre

1

sur l'exécution de vos tests , les configurations sont chargées dans l'ordre suivant (sauf si vous avez personnalisé l'ordre des chemins autoload_paths dans votre application rails):

  1. config/application.rb
  2. config/environnements/test.rb
  3. spec/rails_helper.rb

Alors, la migration erreur en attente que vous recevez doit être dû à config.active_record.migration_error = true cette configuration de configuration quelque part avant sur les rails, le moteur charge rails_helper.rb où la directive ActiveRecord::Migration.maintain_test_schema! est définie.

Essayez de définir config.active_record.migration_error = false sur votre config/environments/test.rb pour passer la vérification de migration.

+0

Je n'ai pas eu l'occasion de vérifier que votre solution fonctionne, mais si c'est le cas, cette ligne devrait-elle être ajoutée au générateur d'installation de RSpec? – ardavis

+0

non .. 'config/environments/test.rb' – sa77

+0

Désolé, je n'étais pas clair. Je sais que cette ligne devrait entrer dans le test.rb. Apparemment, il est par défaut vrai. Si le RSpec par défaut "spec_helper" ajoute la ligne "ActiveRecord :: Migration.maintain_test_schema!", Il semble ne rien faire à moins que 'config.active_record.migration_error' soit défini sur false. Ils semblent aller de pair, non? – ardavis

-4

Vous devez exécuter rails db:migrate RAILS_ENV=test de mettre à jour votre test DB premier. Cela signifie que, plutôt que de simplement augmenter lorsque le schéma de test a des migrations en attente, Rails tentera de charger le schéma. Une exception ne sera maintenant levée que s'il y a des migrations en attente après que le schéma a été chargé.

Il y a quelques mises en garde à connaître lors de l'utilisation ceci:

  • doivent encore migrations exécuter manuellement; bien que cela ne soit maintenant possible que dans l'environnement de «développement».
  • Une exception sera déclenchée si le schéma n'a pas été initialisé. L'exception fournira des instructions indiquant que rake db:migrate doit être exécuté.
+1

Cela ne répond pas à la question de _why_ il doit mettre à jour le DB de test. – tangrs

+0

Ce que cela fait est que, au lieu de simplement augmenter lorsque le schéma de test a en attente de migrations, Rails tentera de charger le schéma. Une exception sera maintenant uniquement si des migrations sont en attente, le schéma a été chargé. Il y a quelques avertissements à prendre en compte lors de l'utilisation de ceci: Les migrations doivent toujours être exécutées manuellement; bien que maintenant cela ne soit fait que dans l'environnement 'développement' Une exception sera levée si le schéma n'a pas été initialisé. L'exception fournira des instructions indiquant que rake db: migrate doit être exécuté. –

+1

Vous devriez éditer cela dans votre réponse. – tangrs

1

Cela peut être dû à deux raisons.

  1. Vous avez peut-être manqué de configurer dans config/environments/test.rb

Ajouter config.active_record.maintain_test_schema = true si vous ne l'avez pas ou le mettre à true si vous aviez mis à false.

De l'docs

config.active_record.maintain_test_schema est une valeur booléenne qui contrôle si Active Record doit essayer de garder votre base de données de test schéma mis à jour avec db/schema.rb (ou db/structure.sql) lorsque vous exécutez vos tests. La valeur par défaut est true.

  1. Vous pourriez avoir migration en attente après le schéma a chargé

De l'rspec docs

Ce que cela fait est que, plutôt Lorsque le schéma de test a des migrations en attente, Rails essaie de charger le schéma.Une exception ne sera désormais levée que s'il y a des migrations en attente après quoi le schéma a été chargé.

Vérifiez si vous avez des migrations en attente avec rake db:migrate:status

Aussi, si vous utilisez SQLite 3.7.9, vous devriez jeter un oeil à ce discussion

+0

Si la valeur par défaut est true, pourquoi devrais-je l'ajouter? – ardavis