2014-09-16 13 views
57

Jestem na Rails 4 i zauważyłem, że niektóre z moich testów RSpec zawodzą, ponieważ niektóre z moich refaktoryzacji testowych używają filtru przed (prawdopodobnie z powodu transakcji). Ten post opisuje podobny problem:Szyny 4: Jak zresetować bazę danych testów?

rails test database not clearing after some runs

Zamiast korzystania z gem DatabaseCleaner, czy istnieje komenda grabie, aby usunąć z bazy testowej? Wierzę rake db:test:prepare jest przestarzałe w Rails 4. Ponadto, jeśli przed transakcjami 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?

Odpowiedz

1

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

85

overkill 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żna zrobić wszystko to w zadaniu natarcia i uruchomić to.

Innym rozwiązaniem z here ma zawierać następujące pliku spec_helper.rb

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

Oświadczenie: Nie testowałem tego i należy przeczytać SO post gdyż nie mogą pracować w każdej sytuacji.

Powiedziawszy to, polecam używanie klejnotu do czyszczenia baz danych, aby uniknąć takich sytuacji.

+1

Pierwsze 3 rake db: * może być zastąpione tylko ostatnim, ponieważ usuwa wszystkie tabele i tworzy je ze schematu. – konole

+0

Brakuje '' '' grab ex exec ': stwórz RAILS_ENV = test' przed 'schema: load' step – Aleks

+0

dla Rails 5, użyj' ApplicationRecord' zamiast 'ActiveRecord :: Base' https://blog.bigbinary.com/2015 /12/28/application-record-in-rails-5.html –

60

To może być:

bundle exec rake db:reset RAILS_ENV=test 
+10

Zauważam, że uruchamia również 'rake db: seed' ... co może ale nie musi być problemem –

0

W teorii ActiveRecord::Migration.maintain_test_schema! powinno załatwić sprawę. Umieszczono go w postaci rails_helper.rb

0

Skończyłem na pisaniu prostego zadania rake, które upuszcza/migruje (lub zrzuca & migruje) wszystkich bazach testowych i programistycznych, w zależności od wykonanego polecenia.

Zawiera funkcjonalność, która monituje użytkownika, czy chce kontynuować, gdy wystąpi błąd, i używa metody popen3 Open3 (tak, że możemy uzyskać dostęp do stdin, stdout i stderr, a wszelkie polecenia zakończone niepowodzeniem nie skutkują proces wykonywania zadania rake'u został przerwany (w przeciwieństwie do systemu system)).

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

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

edit: To muszą być wykonywane ręcznie z muszli, kiedy chcesz wyczyścić bazę danych, jednak.