Factory Girl (Bot) asszociációk

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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.