Speci controlerów - czyszczenie bazy

Hej

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?

Pliki konfiguracyjne:
#spec/spec_helper.rb
https://gist.github.com/1893898

#spec/shared_connection.rb
https://gist.github.com/1939594

#spec/factories.rb
https://gist.github.com/1893891

#spec/controllers/profiles_controller_spec.rb
https://gist.github.com/1939597 [lekko przerobiony scaffold]

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ć:

Może dać to gdzieś w przyklejonych? :> Bo już ze 4 razy o to pytano w różnych przypadkach na forum :wink:

A może zmienić defaulty w Capybarze / rspec_rails coby było po bożemu od razu…

@hubertlepicki
Zauważ że nie robię testów integracyjnych tylko testy kontrolera.
Kod który zapodałeś:

Znam i używam :wink:
#spec/shared_connection.rb
https://gist.github.com/1939594

BTW Problem się już ‘magicznie’ rozwiązał. Nie wiem OCB, być może Spork świruje z Factory Girl.

Dobra już wiem w czym był problem.

Po prostu stosowałem
before(:all)
a zmiany z tego callback’a nie są wycofywane po zakończeniu testu.
Musimy ręcznie posprzątać poprzez
after(:all)

Przypadkiem natknąłem się na tą informacje na owym blogu:
http://kpumuk.info/ruby-on-rails/my-top-7-rspec-best-practices/

Odświeżę temat:

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.