Ez a cikk a has_one, has_many és polymorphic asszociációk adatainak generálását mutatja be a FactoryGirl segítségével. Minden egyes asszociációt egy példával fogunk leírni, így képet kaphatsz arról, hogyan lehet fájdalommentesen összetettebb gyárakat létrehozni.
A has_one asszociáció adatainak generálása
A has_one asszociáció beállítása elég egyszerű, a gyáron belül definiálhatod. Ha a gyár neve megegyezik az asszociáció nevével, akkor a gyár neve elhagyható. Például:
FactoryBot.define do factory :story do # story attributes author endend
Egy másik gyárat is megadhatunk, és felülbírálhatjuk az attribútumokat:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Az asszociáció létrehozásához különböző stratégiákat is megadhatunk:
association :author, factory: :user, strategy: :build
Ne feledjük, hogy ez nem menti el a társított objektumot az adatbázisban.
A has_many asszociáció adatainak generálása
A has_many asszociáció adatainak generálása egy kicsit bonyolultabb. Új gyárat definiálhatunk, és az after(:create) visszahívást használhatjuk az asszociációk listájának létrehozásához. Lássuk, hogyan kell ezt megtenni ebben a példában:
FactoryBot.define do # user factory without associated stories factory :user do # user attributes factory :user_with_stories do transient do stories_count 10 end after(:create) do |user, evaluator| create_list(:stories, evaluator.stories_count, user: user) end end endend
A stories_count attribútum egy tranziens és elérhető a factory attribútumaiban és a callbackben az evaluátoron keresztül. Most létrehozhatunk egy felhasználót történetekkel, ahol megadhatjuk, hogy hány történetet szeretnénk:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Megjegyezzük, hogy minden történetnek egyedi azonosítója lesz, de ahhoz, hogy a többi attribútum egyedi legyen, minden történethez különböző értékeket kell generálnunk.
Ezt a szekvencia példájával érhetjük el:
FactoryBot.define do factory :story do # story attributes sequence(:title) { |n| "Title#{n}" } # Unique title for every story association :author, factory: :user, first_name: "Jon" endend
Létezik egy érdekes gyöngyszem is, amely segíthet egyedi értékek generálásában, a faker.
A polimorf társítások adatainak generálása
A polimorf társítás egy kicsit zavaros lehet. Remélhetőleg ez a példa segít jobban megérteni. Tegyük fel, hogy a következő osztályok polimorfikus asszociációkkal rendelkeznek:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
A polimorfikus modellel rendelkező modellek gyárainak létrehozásakor egyszerűen létrehozzuk a polimorfikus modellt egy after(:create) blokkban, és megadjuk, hogy a polimorfikus legyen az a modell, amelyhez a gyár tartozik:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
És… ennyi!
Köszönjük, hogy elolvasta ezt a cikket.
Ha további érdekes cikkeket szeretne olvasni a Rails-ről, mindenképpen iratkozzon fel hírlevelünkre!
Érdekli a hasonló témák? Ne felejtsd el megnézni az Rspec let vs before, Rspec Setup és FactoryGirl – create vs build vs buldstubbed című írásainkat.