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?
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.
Ça peut être:
bundle exec rake db:reset Rails_ENV=test
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
Vous pouvez ajouter un filtre après en supprimant toutes les entrées des tables concernées.
En théorie, ce ActiveRecord::Migration.maintain_test_schema!
devrait faire l'affaire. Mettez-le dans Rails_helper.rb
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.