Tässä artikkelissa käymme läpi, miten luodaan has_one-, has_many- ja polymorfisten assosiaatioiden tiedot FactoryGirl-ohjelmalla. Jokainen assosiaatio kuvataan esimerkin avulla, jotta saat käsityksen siitä, miten voit luoda monimutkaisempia tehtaita kivuttomasti.
Tiedon tuottaminen has_one-assosiaatiolle
Has_one-assosiaation luominen on melko helppoa, voit määritellä sen tehtaan sisällä. Jos tehtaan nimi on sama kuin assosiaation nimi, tehtaan nimen voi jättää pois. Esimerkiksi:
FactoryBot.define do factory :story do # story attributes author endend
Voit myös määritellä eri tehtaan ja ohittaa attribuutit:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Voidaan määritellä erilaisia strategioita assosiaation luomiseksi:
association :author, factory: :user, strategy: :build
Muista, että tämä ei tallenna assosioitua objektia tietokantaan.
Datan luominen has_many-assosiaatiolle
Datan luominen has_many-assosiaatiolle on hieman monimutkaisempaa. Voit määritellä uuden tehtaan ja käyttää after(:create) -kutsua luodaksesi luettelon assosiaatioista. Katsotaan, miten se tehdään tässä esimerkissä:
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
Attribuutti stories_count on transientti ja käytettävissä tehtaan attribuuteissa ja callbackissa evaluoijan kautta. Nyt voit luoda käyttäjälle tarinoita, joissa on mahdollisuus määrittää, kuinka monta tarinaa haluamme:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Huomaa, että jokaisella tarinalla on yksilöllinen id, mutta jotta muut attribuutit olisivat yksilöllisiä, sinun on generoitava eri arvot jokaiselle tarinalle.
Voit saavuttaa tämän käyttämällä esimerkkinä sekvenssiä:
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
On olemassa myös mielenkiintoinen helmi, joka voi auttaa sinua tuottamaan uniikkeja arvoja nimeltä faker.
Datan tuottaminen polymorfisille assosiaatioille
Polymorfinen assosiaatio voi olla hieman sekava. Toivottavasti tämä esimerkki auttaa sinua ymmärtämään sen paremmin. Oletetaan, että sinulla on seuraavat luokat, joilla on polymorfisia assosiaatioita:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
Kun luot tehtaita malleille, joilla on polymorfinen malli, luot yksinkertaisesti polymorfisen mallin after(:create)-lohkossa ja määrittelet polymorfisen mallin olevan malli, jolle tehdas on tarkoitettu:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
Ja… that’s it!
Kiitos, että luit tämän artikkelin.
Jos olet kiinnostunut lukemaan lisää mielenkiintoisia artikkeleita Railsista, muista tilata uutiskirjeemme!
Kiinnostuitko vastaavista aiheista? Muista lukea näkemyksemme Rspec let vs before, Rspec Setup ja FactoryGirl – create vs build vs buldstubbed.