Factory Girl(Bot) Asocijacije
U ovom članku ćemo proći kroz generisanje podataka za has_one, has_many i polimorfne asocijacije pomoću FactoriGirl. Svaka asocijacija će biti opisana na primeru, tako da možete dobiti ideju kako stvoriti složenije fabrike bez muke.
Generisanje podataka za udruživanje has_one
Postavljanje has_one asocijacije je prilično jednostavno, možete ga definisati u fabrici. Ako je ime fabrike isto kao i ime udruženja, ime fabrike može biti izostavljeno. Na primer:
FactoryBot.define do
factory :story do
# story attributes
author
end
end
Takođe, možete navesti različite atribute fabrike i poništiti:
FactoryBot.define do
factory :story do
# story attributes
association :author, factory: :user, first_name: "Jon"
end
end
Moguće je odrediti različite strategije za stvaranje asocijacije:
association :author, factory: :user, strategy: :build
Imajte na umu da ovo neće sačuvati pridruženi objekat u bazi podataka.
Generisanje podataka za udruživanje has_many
Generisanje podataka za asocijaciju has_many je malo složenije. Možete definisati novu fabriku i koristiti after(:create) povratnog poziva za kreiranje liste asocijacija. Pogledajmo kako se to radi u ovom primeru:
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
end
end
Atribut stories_count je privremen i dostupan je u atributima fabrike i u povratnom pozivu preko evaluatora. Sada možete stvoriti korisnika sa pričama sa opcijom da odredite koliko priča želimo:
create(:user_with_stories).stories.length # 10
create(:user_with_stories, stories_count: 15).stories.length # 15
Imajte na umu da će svaka priča imati jedinstveni ID, ali da bi ostali atributi bili jedinstveni, morate generisati različite vrednosti za svaku priču.
To možete postići koristeći sekvencu kao primer:
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"
end
end
Tu je i zanimljiv gem koji vam može pomoći da generišete jedinstvene vrednosti zvane fejker .
Generiranje podataka za polimorfne asocijacije
Polimorfna asocijacija može biti pomalo zbunjujuća. Nadam se da će vam ovaj primer pomoći da ga bolje razumete. Recimo da imate sledeće klase sa polimorfnim asocijacijama:
class Profile
belongs_to :profileable, polymorphic: true
end
class Account
belongs_to :accountable, polymorphic: true
end
class User
has_one :profile, as: :profileable
has_one :account, as: :accountable
end
Kada kreirate fabrike za modele koji imaju polimorfni model, vi jednostavno kreirate polimorfni model u bloku after(: create) i odredite polimorfni model za koji je fabrika namenjena:
FactoryBot.define do
factory :user, class: User do
# user attributes
after(:create) do |user|
create(:account, accountable: user)
create(:profile, profileable: user)
end
end
end
I to je to!
Hvala vam što ste pročitali ovaj članak.
Ako ste zainteresovani za čitanje još zanimljivih članaka o Rails-u, obavezno se pretplatite na naš bilten!
Zanimaju vas slične teme? Obavezno proverite naše mišljenje o Rspec let vs before , Rspec Setup i FactoryGirl - create vs build vs buldstubbed .