describe "AdminLayoutLinks" do
before(:all) do
user = Factory(:user, :admin => true, :email => "testadmin@example.com")
visit root_path
fill_in "session[email]", :with => user.email
fill_in "session[password]", :with => user.password
click_button
end
(...)
end
Przy pierwszym wykonaniu wszystkie testy przechodzą, ale przy następnych przebiegach dostaję za każdym razem
Failure/Error: user = Factory(:user, :admin => true, :email => "testadmin@example.com")
Negatywne sprawdzenie poprawności: Adres e-mail Podany adres e-mail został już zajęty
Co mam tu poprawić?
Musisz wyczyścić bazę. Nie przechodzi walidacja użytkownika, bo już taki w bazie istnieje. Przy okazji, ja bym użył before(:each), żeby w każdym teście ten user nie był tym samym rekordem w bazie.
Aha, moje myślenie szło w tą stronę, że jak użyję before(:all) to akcja się wykona raz przed wszystkimi testami i potem nie będzie problemu z nakładającymi się emailami. Jak się okazuje, myślałem źle. Może wynika to też z tego, że nie do końca rozumiem działanie factory_gir. Dzięki.
Różnica często niedostrzegana jest taka, że każdy przykład jest otoczony blokami before i after :each i wykonują się one w transakcji, która jest później cofana. Blok :all jest wykonywany poza transakcją i stąd jest potrzeba usunięcia utworzonego właśnie rekordu w bloku after(:all).