Ich bin auf Rails 4 und habe festgestellt, dass einige meiner RSpec-Tests fehlgeschlagen sind, weil einige meiner Refactorings einen Vorfilter verwenden (vermutlich aufgrund von Transaktionen). Dieser Beitrag beschreibt ein ähnliches Problem:
Rails-Testdatenbank wird nach einigen Läufen nicht gelöscht
Gibt es anstelle des DatabaseCleaner-Gem einen Rake-Befehl zum Löschen der Testdatenbank? Ich glaube, rake db:test:prepare
ist in Rails 4 veraltet. Auch wenn vor Transaktionen wie
post :create, user: Fabricate.attributes_for(:user)
sind hartnäckig. Gibt es eine alternative Art des Refactorings, um zu vermeiden, dass die Testdatenbank manuell gelöscht werden muss?
Eine Overkill-Lösung wäre:
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
Sie könnten dies alles in einer Rechenaufgabe machen und ausführen.
Eine andere Lösung von here besteht darin, die folgende spec_helper.rb
-Datei einzuschließen
config.after :all do
ActiveRecord::Base.subclasses.each(&:delete_all)
end
Haftungsausschluss: Ich habe dies nicht getestet und Sie sollten den SO post lesen, da er möglicherweise nicht in allen Situationen funktioniert.
Ich würde jedoch empfehlen, den Datenbank-Cleaner-Gem zu verwenden, um Situationen wie diese zu vermeiden.
Es kann sein:
bundle exec rake db:reset Rails_ENV=test
Manchmal müssen Sie diesen Befehl möglicherweise ausführen (optional).
Rails db:environment:set Rails_ENV=test
Aber sicher, Ihre Testdatenbank zu löschen, sollte so einfach sein wie:
Rails db:drop db:create db:migrate Rails_ENV=test
Sie können einen Nachfilter hinzufügen, indem Sie alle Einträge aus den betroffenen Tabellen löschen.
In der Theorie sollte dieser ActiveRecord::Migration.maintain_test_schema!
den Trick tun. Legen Sie es in Rails_helper.rb
Am Ende schrieb ich eine einfache Rake-Aufgabe, die alle Test- und Entwicklungsdatenbanken löscht (bzw. löscht und migriert), abhängig vom ausgeführten Befehl.
Sie enthält eine Funktion, die den Benutzer auffordert, bei einem Fehler fortzufahren, und verwendet die popen3-Methode von Open3 (so dass wir auf stdin, stdout und stderr zugreifen können Abbruch (anders als bei system)).
Hoffentlich hilft das jemandem. :)
https://github.com/xtrasimplicity/rake_all_db_helper/
bearbeiten: Dies muss jedoch manuell von Ihrer Shell ausgeführt werden, wann immer Sie Ihre Datenbank löschen möchten.