Zauważyłem że podczas speców do modeli nie potrzebuje czyścić bazy, nie muszę instalować żadnego database_clean’era.
Natomiast podczas uruchamiania speców do kontrolerów jeśli nie wyczyszczę bazy to gdy spec się nie powiedzie dostaje błąd:
Failure/Error: @user = Factory(:user)
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken
Ktoś może mi wytłumaczyć dlaczego podczas testowania kontrolerów jest to wymagane (w sensie nie usuwa obiektów, zostaje spam w db), a podczas testów modelów nie?
Problem występuje, gdyż Capybara startuje sobie serwer w oddzielnym wątku. W tym momencie, dostaje on nowe połączenie do bazy. Różne połącznie == różna transakcja w którą jest to opakowane (bądź nie, jak w przypadku serwera capybary). Rollback zrobiony w wątku RSpec nie rusza danych dodanych przez serwer odpalony w wątku Capybary.
Są 2 rozwiązania: albo użycie współdzielonego połąćzenia pomiędzy bazami, albo użycie database_cleanera zamiast transactional fixtures. Ja bym preferował współdzielone połąćzenie do bazy, o ile będzie Ci to dobrze działać:
shared_connection.rb nie współgra dobrze z PostgreSQL (jeśli korzystamy z SSL).
W takim przypadku rozwiązaniem (przetestowanym i działającym) wydaje się database cleaner.