Rails 4: Jak zresetować testową bazę danych?

88

Jestem na Rails 4 i zauważyłem, że niektóre z moich testów RSpec zawodzą, ponieważ niektóre z moich refaktoryzacji testów używają filtru przed (prawdopodobnie z powodu transakcji). W tym poście opisano podobny problem:

baza danych testowych rails nie jest czyszczona po kilku uruchomieniach

Czy zamiast używania klejnotu DatabaseCleaner istnieje polecenie rake, aby wyczyścić testową bazę danych? Uważam, że rake db:test:preparejest przestarzały w Railsach 4. Również, jeśli przed transakcjami, takimi jak

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

są trwałe. Czy istnieje alternatywny sposób refaktoryzacji, aby uniknąć konieczności ręcznego czyszczenia testowej bazy danych?

Salomons_Ecclesiastes
źródło

Odpowiedzi:

121

Przesadnym rozwiązaniem byłoby:

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

Możesz zrobić to wszystko w zadaniu prowizji i uruchomić to.

Innym rozwiązaniem z tutaj ma obejmować następujące swój spec_helper.rbplik

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

Zastrzeżenie: nie testowałem tego i powinieneś przeczytać post SO, ponieważ może nie działać we wszystkich sytuacjach.

Biorąc to pod uwagę, zalecałbym użycie klejnotu do czyszczenia bazy danych, aby uniknąć takich sytuacji.

ChrisBarthol
źródło
1
Pierwsze 3 rake db: * można zastąpić tylko ostatnim, ponieważ usuwa wszystkie tabele i tworzy je ze schematu.
konole
2
dla Rails 5, ApplicationRecordzamiast ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke
3
Użyj, rake db:structure:loadjeśli używasz structure.sql zamiast schema.rb.
Archonic
2
Schludniejszy 1 wkładka do powyższego to po prostu:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667
98

To może być:

bundle exec rake db:reset RAILS_ENV=test
mpz
źródło
21
Zauważyłem, że to również działa rake db:seed ... co może, ale nie musi, stanowić problem
Harry Wood
1
Jeśli używasz Rails 5, polecenie brzmi teraz rails zamiast rake:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández
20

Czasami może być konieczne uruchomienie tego polecenia (opcjonalnie)

rails db:environment:set RAILS_ENV=test

Ale z pewnością wyczyszczenie testowej bazy danych powinno być tak proste, jak:

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

d1jhoni1b
źródło
2

Możesz dodać filtr końcowy, usuwając wszystkie wpisy z odpowiednich tabel.

nbirla
źródło
0

W teorii ActiveRecord::Migration.maintain_test_schema!powinno to załatwić sprawę. Włóż torails_helper.rb

do Pana
źródło
0

Skończyło się na napisaniu prostego zadania rake, które porzuca / migruje (lub upuszcza i migruje) wszystkie testowe i programistyczne bazy danych, w zależności od wykonanego polecenia.

Zawiera funkcję podpowiadania użytkownikowi, czy chciałby kontynuować, gdy wystąpi błąd i używa metody popen3 Open3 (takiej, że możemy uzyskać dostęp do stdin, stdout i stderr; a żadne nieudane polecenia nie powodują procesu rake) przerywanie (w przeciwieństwie do korzystania z system )).

Mam nadzieję, że to komuś pomoże. :)

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

edycja: Będzie to musiało być wykonane ręcznie z Twojej powłoki, gdy będziesz chciał wyczyścić bazę danych.

XtraSimplicity
źródło