web-dev-qa-db-fra.com

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

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

La base de données de test Rails ne s'efface pas après quelques 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:prepare est obsolète dans Rails 4. En outre, si avant, des transactions comme

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

sont persistants. Existe-t-il une autre méthode de refactorisation permettant d'éviter d'effacer manuellement la base de données de test?

69

Une solution excessive 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 commission et l'exécuter.

Une autre solution de ici consiste à inclure ce qui suit dans votre fichier spec_helper.rb

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

Clause de non-responsabilité: je n'ai pas testé cela et vous devriez lire le message SO car cela pourrait ne pas fonctionner dans toutes les situations.

Cela étant dit, je recommanderais d'utiliser la gemme nettoyeur de base de données pour éviter de telles situations.

101
ChrisBarthol

Ça peut être:

bundle exec rake db:reset Rails_ENV=test
72
mpz

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

Rails db:environment:set Rails_ENV=test

Mais bien sûr, effacer votre base de données de tests devrait être aussi facile que

Rails db:drop db:create db:migrate Rails_ENV=test

3
d1jhoni1b

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

1
nbirla

En théorie, ce ActiveRecord::Migration.maintain_test_schema! devrait faire l'affaire. Mettez-le dans Rails_helper.rb

0
tomr

J'ai fini par écrire une tâche de ratissage simple qui supprime/migre (ou abandonne 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é permettant d'indiquer à l'utilisateur s'il souhaite continuer ou non lorsqu'une erreur se produit et utilise la méthode popen3 d'Open3 (telle 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 de system)).

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

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

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

0
XtraSimplicity