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:prepare
jest 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?
źródło
ApplicationRecord
zamiastActiveRecord::Base
blog.bigbinary.com/2015/12/28/…rake db:structure:load
jeśli używasz structure.sql zamiast schema.rb.RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
To może być:
bundle exec rake db:reset RAILS_ENV=test
źródło
rake db:seed
... co może, ale nie musi, stanowić problembundle exec rails db:reset RAILS_ENV=test
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
źródło
Możesz dodać filtr końcowy, usuwając wszystkie wpisy z odpowiednich tabel.
źródło
W teorii
ActiveRecord::Migration.maintain_test_schema!
powinno to załatwić sprawę. Włóż torails_helper.rb
źródło
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.
źródło