wake-up-neo.com

Rails 4: Wie kann ich die Testdatenbank zurücksetzen?

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?

69

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.

101
ChrisBarthol

Es kann sein:

bundle exec rake db:reset Rails_ENV=test
72
mpz

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

3
d1jhoni1b

Sie können einen Nachfilter hinzufügen, indem Sie alle Einträge aus den betroffenen Tabellen löschen.

1
nbirla

In der Theorie sollte dieser ActiveRecord::Migration.maintain_test_schema! den Trick tun. Legen Sie es in Rails_helper.rb

0
tomr

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.

0
XtraSimplicity