Załóżmy, że mam modele User
i Post
, użytkownika has_many
i posta belongs_to
użytkownika.Przyspieszenie skojarzeń ze specyfikacją modelu za pomocą FactoryGirl - utwórz vs buduj, a następnie zainstaluj ponownie.
Kiedy piszę spec Post
, moim pierwszym odruchem jest napisać coś takiego:
before do
@user = FactoryGirl.create :user
@post = @user.posts.new(title: "Foo", content: "bar)
end
... tests for @post go here ...
Ale to się dzieje, aby utworzyć nowego użytkownika - uderzanie bazy danych - dla każdego testu, który jest zamierzam spowolnić działania. Czy istnieje lepszy sposób na zrobienie tego, co przyspieszy moje testy i uniknie tak częstego uderzania w DB?
Jak rozumiem, nie mogę używać FactoryGirl.build :user
ponieważ, mimo że nie trafi na DB, stowarzyszenia nie będzie działać poprawnie ponieważ @user
nie będzie miał identyfikator i tak @post.user
nie zadziała (zwraca nil
).
mogę użyć FactoryGirl.build_stubbed :user
który stworzył „Fake utrzymywały” @user
który ma identyfikator, ale @post.user
nadal zwraca nil. Czy build_stubbed
ma jakąś praktyczną przewagę nad build
, kiedy testuję rzeczy związane z skojarzeniami?
Przypuszczam, że mógłbym użyć kodu build_stubbed
stub @post.user
, więc zwraca @user
... czy jest jakiś powód, dla którego może to być zły pomysł?
Czy powinienem po prostu użyć create
i zaakceptować prędkość uderzenia?
Jedyną alternatywą, o której mogę pomyśleć, to ustawienie @user w bloku before(:all)
, co wydaje się złym pomysłem.
Jaki jest najlepszy sposób pisania tego rodzaju testów w czysty, zwięzły sposób, który pozwala uniknąć zbyt wielu zapytań DB?