Rails 4: Comment réinitialiser la base de données de test?

87

Je suis sur Rails 4 et j'ai remarqué que certains de mes tests RSpec échouent parce que certains de mes refactorings de test utilisent un filtre avant (probablement à cause des transactions). Cet article décrit un problème similaire:

la base de données de test des rails ne s'efface pas après certaines exécutions

Au lieu d'utiliser la gemme DatabaseCleaner, existe-t-il une commande rake pour effacer la base de données de test? Je crois que rake db:test:preparec'est obsolète dans Rails 4. Aussi, si avant des transactions comme

post :create, user: Fabricate.attributes_for(:user)

sont persistants. Existe-t-il une autre manière de refactoriser pour éviter d'avoir à effacer manuellement la base de données de test?

Solomons_Ecclésiaste
la source

Réponses:

120

Une solution exagérée serait:

bundle exec rake db:drop RAILS_ENV=test
bundle exec rake db:create RAILS_ENV=test
bundle exec rake db:schema:load RAILS_ENV=test

Vous pouvez faire tout cela dans une tâche de râteau et l'exécuter.

Une autre solution à partir d' ici est d'inclure ce qui suit votre spec_helper.rbfichier

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

Avertissement: Je n'ai pas testé cela et vous devriez lire le message SO car il peut ne pas fonctionner dans toutes les situations.

Cela étant dit, je recommanderais d'utiliser la gemme de nettoyage de base de données pour éviter des situations comme celle-ci.

ChrisBarthol
la source
1
Les 3 premiers rake db: * ne peuvent être remplacés que par le dernier car il supprime toutes les tables et les crée à partir du schéma.
konole
2
pour Rails 5, utilisez à la ApplicationRecordplace de ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke
3
À utiliser rake db:structure:loadsi vous utilisez structure.sql au lieu de schema.rb.
Archonic
2
Une doublure plus RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
soignée
98

Ça peut être:

bundle exec rake db:reset RAILS_ENV=test
mpz
la source
20
Je remarque que cela fonctionne aussi rake db:seed ... ce qui peut ou non être un problème
Harry Wood
1
Si vous utilisez Rails 5, la commande est désormais rails au lieu de rake:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández
15

Parfois, vous devrez peut-être exécuter cette commande (facultatif)

rails db:environment:set RAILS_ENV=test

Mais à coup sûr, effacer votre base de données de test devrait être aussi simple que:

rails db:drop db:create db:migrate RAILS_ENV=test

d1jhoni1b
la source
2

Vous pouvez ajouter un filtre après en supprimant toutes les entrées des tables concernées.

nbirla
la source
0

En théorie, cela ActiveRecord::Migration.maintain_test_schema!devrait faire l'affaire. Mettre dansrails_helper.rb

tomr
la source
0

J'ai fini par écrire une simple tâche de rake qui supprime / migre (ou supprime et migre) toutes les bases de données de test et de développement, en fonction de la commande exécutée.

Il inclut une fonctionnalité pour demander à l'utilisateur s'il souhaite continuer lorsqu'une erreur se produit, et utilise la méthode popen3 d'Open3 (de sorte que nous puissions accéder à stdin, stdout et stderr; et toute commande échouée n'entraîne pas le processus de la tâche rake. abandon (contrairement à l'utilisation du système )).

Espérons que cela aide quelqu'un. :)

https://github.com/xtrasimplicity/rake_all_db_helper/

edit: Cela devra être exécuté manuellement à partir de votre shell, chaque fois que vous souhaitez effacer votre base de données, cependant.

XtraSimplicité
la source