Schienen 4: Wie setze ich die Testdatenbank zurück?

84

Ich bin auf Rails 4 und habe festgestellt, dass einige meiner RSpec-Tests fehlschlagen, weil einige meiner Test-Refactorings einen Vorher-Filter 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-Gems einen Rake-Befehl zum Löschen der Testdatenbank? Ich glaube, rake db:test:prepareist in Rails 4 veraltet. Auch wenn vor Transaktionen wie

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

sind hartnäckig. Gibt es eine alternative Möglichkeit zum Refactoring, um zu vermeiden, dass die Testdatenbank manuell gelöscht werden muss?

Solomons_Ecclesiastes
quelle

Antworten:

118

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 das ausführen.

Eine andere Lösung von hier besteht darin, Folgendes in Ihre spec_helper.rbDatei aufzunehmen

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

Haftungsausschluss: Ich habe dies nicht getestet und Sie sollten den SO-Beitrag lesen, da er möglicherweise nicht in allen Situationen funktioniert.

Davon abgesehen würde ich empfehlen, das Datenbank-Cleaner-Juwel zu verwenden, um solche Situationen zu vermeiden.

ChrisBarthol
quelle
1
Die ersten 3 Rake-Datenbanken: * dürfen nur durch die letzten ersetzt werden, da alle Tabellen gelöscht und aus dem Schema erstellt werden.
Konole
2
Verwenden Sie für Rails 5 ApplicationRecordanstelle von ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke
3
Verwenden rake db:structure:loadSie diese Option, wenn Sie struct.sql anstelle von schema.rb verwenden.
Archonic
2
Ein ordentlicher 1 Liner für die oben genannten ist einfach:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667
95

Es kann sein:

bundle exec rake db:reset RAILS_ENV=test
mpz
quelle
20
Ich rake db:seed
Harry Wood
1
Wenn Sie Rails 5 verwenden, lautet der Befehl jetzt Rails anstelle von Rake:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández
12

Manchmal müssen Sie diesen Befehl möglicherweise ausführen (optional).

rails db:environment:set RAILS_ENV=test

Das Löschen Ihrer Testdatenbank sollte jedoch so einfach sein wie:

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

d1jhoni1b
quelle
2

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

nbirla
quelle
0

Theoretisch ActiveRecord::Migration.maintain_test_schema!sollte dies den Trick tun. Setzen Sie es einrails_helper.rb

an Herrn
quelle
0

Am Ende habe ich eine einfache Rechenaufgabe geschrieben, die je nach ausgeführtem Befehl alle Test- und Entwicklungsdatenbanken löscht / migriert (oder löscht und migriert).

Es enthält Funktionen, mit denen der Benutzer gefragt wird, ob er bei Auftreten eines Fehlers fortfahren möchte, und verwendet die popen3-Methode von Open3 (sodass wir auf stdin, stdout und stderr zugreifen können; fehlgeschlagene Befehle führen nicht zum Prozess der Rake-Task Abbruch (anders als bei Verwendung des Systems )).

Hoffentlich hilft das jemandem. :) :)

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

Bearbeiten: Dies muss manuell von Ihrer Shell ausgeführt werden, wenn Sie jedoch Ihre Datenbank löschen möchten.

XtraSimplicity
quelle