Wprowadzenie do Factory Girl nakreśla różnicę między FactoryGirl.build()
i FactoryGirl.create()
:
# Returns a User instance that's not saved
user = FactoryGirl.build(:user)
# Returns a saved User instance
user = FactoryGirl.create(:user)
Nadal nie rozumiem praktycznych różnic między nimi. Czy ktoś może podać przykład, w którym chciałbyś użyć jednego, a nie drugiego? Dzięki!
źródło
create
zbuild
, i cofnąć go, jeśli test się nie powiedzie?#create
odczytuje i zwraca utrwalony obiekt z dysku, czy też zwraca obiekt znajdujący się w pamięci po jego utrwaleniu? Innymi słowy, czy robienie jestcreate(...)
równoważne zcreate(...).reload
?Używanie
FactoryGirl.build(:factory_name)
nie jest utrwalane w bazie danych i nie wywołujesave!
, więc walidacja modułu Active Record nie będzie działać. Jest to znacznie szybsze, ale walidacja może być ważna.Użycie
FactoryGirl.create(:factory_name)
pozostanie w bazie danych i wywoła walidację modułu Active Record. Jest to oczywiście wolniejsze, ale może wychwycić błędy walidacji (jeśli zależy Ci na nich w testach).źródło
FactoryGirl.create()
utworzy dla niego nowy obiekt i skojarzenia (jeśli fabryka je posiada). Wszystkie zostaną utrwalone w bazie danych. Spowoduje to również uruchomienie walidacji modelu i bazy danych. Połączenia zwrotneafter(:build)
iafter(:create)
zostaną wywołane po zapisaniu ustawień fabrycznych. Równieżbefore(:create)
zostanie wezwany przed fabryka została zapisana.FactoryGirl.build()
nie zapisze obiektu, ale nadal będzie wysyłać żądania do bazy danych, jeśli fabryka ma skojarzenia. Spowoduje to uruchomienie walidacji tylko dla powiązanych obiektów. Callbackafter(:build)
zostanie wywołany po zbudowaniu fabryki.Należy pamiętać, że w większości przypadków podczas testowania modeli najlepiej używać w
build_stubbed
celu uzyskania lepszej wydajności. Przeczytaj więcej na ten temat tutaj .źródło