2009-07-27 10 views
20

Ostatnio przełączyłem się z urządzeń na factory_girl, aby przetestować aplikację Ruby on Rails. Jeśli uruchomię test rake: jednostki, aby uruchomić testy w moim katalogu/units, wszystkie działają idealnie. To samo dotyczy wykonywania testów funkcjonalnych (w moim/katalogu funkcjonalnym) z testem rake: functionals.Czyszczenie testowej bazy danych między jednostkami i testami funkcjonalnymi w Railsach (factory_girl)

Jednakże, jeśli po prostu uruchomię test prowizji, aby uruchomić zarówno moją jednostkę, jak i testy funkcjonalne, moja walidacja zakończy się niepowodzeniem w drugiej grupie testów (funkcjonalnych, w tym przypadku), z komunikatem "Sprawdzanie poprawności nie powiodło się: Nazwa już został zabrany."

Uważam, że jest to spowodowane testami funkcjonalnymi tworzącymi obiekty o takich samych parametrach jak obiekty, które zostały utworzone w testach jednostkowych - prowadząc mnie do przekonania, że ​​testowa baza danych nie została wyczyszczona między jednostką a testami funkcjonalnymi .

Używam sekwencjonowania factory_girl, aby mieć unikalne atrybuty dla obiektów, co oznacza, że ​​factory_girl jest resetowany między testami, podczas gdy baza danych nie jest. Co mogę zrobić, aby rozwiązać ten problem? Czy istnieje sposób na wyczyszczenie bazy danych między dwoma pakietami testowymi?

+1

znalazłeś jakieś rozwiązanie tego problemu? Mam dokładnie to samo. Z jakiegoś powodu sekwencje fabryczne są resetowane między testami funkcjonalnymi i jednostkowymi. – sandstrom

Odpowiedz

11

Spróbuj napisać to w swoim test/test_helper.rb

eval IO.read(File.expand_path(File.dirname(__FILE__) + "/../Rakefile")) 
class Test::Unit::TestCase 
.... 
#db:test:prepare won't work, don't know why, 
#as DROP DATABASE won't execute (me on PostgreSQL). 
#even if I write, 
#ActiveRecord::Base.connection.disconnect! 
Rake::Task["db:reset"].invoke 
end 

To nie zalecane rozwiązanie. Sprawia, że ​​testy są wolniejsze, ale działa.

+0

Idealne, dzięki! W tej chwili nie mam zbyt wielu testów, więc prędkość nie jest jeszcze dużym problemem. – NolanDC

+0

To działa również dla mnie! Czy ktoś wie, dlaczego tak się dzieje? Od pewnego czasu używam fabryk i nigdy nie było to problemem. Wydaje się, że przyczyną problemu jest aktualizacja z fabryki do dziewczyny-szyny fabrycznej ... Używam szyn 3.2.2 –

4

Wtyczka railsowa o nazwie "override_rake_task" może być użyta do zastąpienia zadania Rake "test", które jest zdefiniowane wewnątrz, jeśli gem Rails. Jest to bardzo proste zadanie, które wykonuje kolejno trzy inne zadania: test : jednostki, test: funkcjonalności i test: integracja. Można dołączyć wykonanie zadania "db: test: purge", aby wyczyścić testową bazę danych przed wykonaniem testu: funkcjonale.

Wygląda na to, że jeśli nie korzystasz z tej wtyczki i zdefiniujesz zadanie w aplikacji szyny o tej samej nazwie, rake wykona oba zadania: domyślny i twój.

+0

Czy istnieje sposób na wykonanie db: test: purge pomiędzy jednostką a testami funkcjonalnymi bez przesłonięcia domyślnych zadań rake? – NolanDC

+0

Tak, prawdopodobnie możesz zrobić to samo bez wtyczki przez usunięcie domyślnego zadania i dodanie nowego z tym samym kodem + "db: test: purge": "remove_task: test", a następnie "task: test do .. . koniec". Widziałem to tutaj: http://www.taknado.com/2007/7/30/overriding-rake-tasks/ –

2

Powyższe rozwiązania nie działają dla mnie. Jeśli próbujesz dotrzeć do zewnętrznej bazy danych, testy jednostek mogą powodować dziwne błędy. Z jakiegoś powodu nie są one usuwane po uruchomieniu testu, więc po przeprowadzeniu testów jednostkowych należy uruchomić rake db:test:purge. Umieść to w swoim Rakefile i powinno to naprawić.

Rake::Task["db:test:prepare"].enhance do 
    Rake::Task["db:test:purge"].invoke 
end 
1

wpadłem na ten problem na moim komputerze. Otrzymywałem awarie testowe, od problemów z walidacją, ponieważ baza danych nie była poprawnie resetowana między testami. Niektóre z powrotem opowieść o mojej sytuacji:

 
-I had a linux box, and was running code, that I knew should pass the tests. 
-I bought a Mac with Lion installed and attempted to get my code running on that machine. 
-I installed mysql from source 

Wszystko zainstalowane prawidłowo. Moja baza danych działała, a szyny miały do ​​niej dostęp. Kiedy jednak testowałem, wpadłem na ten sam problem. Natknąłem się na ten post i próbowałem obu proponowanych rozwiązań (mimo że nie wydawało mi się to problemem kodu, wydawało mi się, że problem z konfiguracją, ponieważ prowizja działała dobrze na moim komputerze z Linuksem). Żadne z rozwiązań nie działa.

usunąłem MySQL:

 
sudo rm /usr/local/mysql 
sudo rm -rf /usr/local/mysql* 
sudo rm -rf /Library/StartupItems/MySQLCOM 
sudo rm -rf /Library/PreferencePanes/My* 
sudo rm -rf /Library/Receipts/mysql* 
sudo rm -rf /Library/Receipts/MySQL* 
sudo rm /etc/my.cnf 
sudo rm /usr/local/bin/mysql* 

ponownie zainstalować MySQL z homebrew zamiast ręcznie robi to od źródła (etap ten był uprzejmości zaleceniem współpracownika):

 
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH" 
brew install https://github.com/adamv/homebrew-alt/raw/master/versions/mysql51.rb 
unset TMPDIR 
mysql_install_db 

I ponownie -rake rake i wszystkie testy minęły. Jeśli ktoś jest na Lwie, zbudował mysql ze źródła i wpadł na ten problem, może to być rozwiązanie.

12

Rozwiązanie wiersza polecenia, aby wyczyścić (Rekonstrukc) testowej bazy danych:

rake db:test:prepare 
0

DB Cleaner to całkiem ładny gem specjalnie do czyszczenia między testami. Daje kilka opcji, w tym zawijanie każdego testu w transakcji i wycofywanie, obcinanie tabeli i usuwanie.

Obsługuje również wiele ORMS w przypadku, gdy nie używasz/używasz więcej niż aktywny rekord.

Dokumentacja jest całkiem niezła i zawiera przykłady użycia jej w MiniTest, Rspec i Cucumber.

https://github.com/bmabey/database_cleaner

Powiązane problemy